我很难找到一种方式在斯卡拉同时施加上限和下限类型的界限。我需要做一个泛型函数,其中类型参数是可散列的(AnyRef的子类型)和可为空(超类型为空)。斯卡拉上限和下限类型绑定
我能达到前者是这样的:
def foo[T <: AnyRef](t: T) = ???
而后者是这样的:
def bar[T >: Null)(t: T) = ???
有没有一种方法,我可以同时做两个?谢谢。
我很难找到一种方式在斯卡拉同时施加上限和下限类型的界限。我需要做一个泛型函数,其中类型参数是可散列的(AnyRef的子类型)和可为空(超类型为空)。斯卡拉上限和下限类型绑定
我能达到前者是这样的:
def foo[T <: AnyRef](t: T) = ???
而后者是这样的:
def bar[T >: Null)(t: T) = ???
有没有一种方法,我可以同时做两个?谢谢。
这是怎么回事?
def foo[T >: Null <: AnyRef](t: T) = ???
它应该工作。那就是:
foo(42) // does not compile
foo(null) // compiles
foo("hello") // compiles
任何类型的的AnyRef
子类可以被分配值null
,所以你不需要的上限。
def foo[T <: AnyRef](x: T) = x
foo(null) // returns null
这就是说,因为你需要能够散列值,应该注意的是,如果你试图取消引用null
(例如null.hashCode
),你会得到一个NullPointerException
。例如:
def foo[T <: AnyRef](x: T) = x.hashCode
foo(null) // Throws an NPE
此外,在斯卡拉程序的任何使用null
强烈劝阻。轴承都考虑到这一点,我想你可能真正想要的是这样的事情,它适用于任何类型:
def foo[T](x: Option[T]) = x.hashCode
def foo(None) // Works. None is equivalent to no value (and Option(null) == None).
def foo(Some(1)) // Works. Note an Int isn't an AnyRef or nullable!
def foo(Some("Hello, world!")) // Works
def foo(Option(null)) // Works.
def foo(Option(z)) // Works, where z can be any reference type value, including null.
Option[T]
是应对不确定的值(如可空类型)的功能构件,它适用于任何类型的T
。
一般来说,我不知道是否有可能在两个方向上都有类型边界。但在具体情况下,不是所有Scala中AnyRef超类型的子类型都是空的吗? –
不,因为Nothing是Null的子类型,因此,它不会让我将null指定为由AnyRef的子类型定界的类型变量。 – Phoenix
呵呵。有趣。 @ lambdista的解决方案似乎为我工作(而我所尝试的,反转类型边界的顺序def foo [T <: AnyRef >:空](t:T)= ???'不) –