2017-10-08 49 views
1

我很难找到一种方式在斯卡拉同时施加上限和下限类型的界限。我需要做一个泛型函数,其中类型参数是可散列的(AnyRef的子类型)和可为空(超类型为空)。斯卡拉上限和下限类型绑定

我能达到前者是这样的:

def foo[T <: AnyRef](t: T) = ??? 

而后者是这样的:

def bar[T >: Null)(t: T) = ??? 

有没有一种方法,我可以同时做两个?谢谢。

+0

一般来说,我不知道是否有可能在两个方向上都有类型边界。但在具体情况下,不是所有Scala中AnyRef超类型的子类型都是空的吗? –

+0

不,因为Nothing是Null的子类型,因此,它不会让我将null指定为由AnyRef的子类型定界的类型变量。 – Phoenix

+2

呵呵。有趣。 @ lambdista的解决方案似乎为我工作(而我所尝试的,反转类型边界的顺序def foo [T <: AnyRef >:空](t:T)= ???'不) –

回答

3

这是怎么回事?

def foo[T >: Null <: AnyRef](t: T) = ??? 

它应该工作。那就是:

foo(42) // does not compile 
foo(null) // compiles 
foo("hello") // compiles 
1

任何类型的的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