我很難找到一種方式在斯卡拉同時施加上限和下限類型的界限。我需要做一個泛型函數,其中類型參數是可散列的(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)= ???'不) –