簡體   English   中英

Scala上下類型邊界

[英]Scala upper and lower type bound

我在Scala中找到一種方法來同時強加一個上,下類型約束時遇到了麻煩。 我需要制作一個泛型函數,其中類型參數既可哈希(AnyRef的子類型)又可空(Null的超類型)。

我可以這樣實現前者:

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

此外,強烈建議不要在Scala程序中使用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]是處理未定義值(例如, null的類型 )的功能性手段,並且適用於任何類型T

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM