2017-10-08 65 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