null作为类型参数的实例

时间:2014-12-10 10:55:12

标签: scala generics null type-parameter

好吧,我知道比使用null作为设计选择更好,但在这种情况下我必须这样做。以下为什么不编译?

def test[T<:AnyRef](o :Option[T]) :T = o getOrElse null

Error:(19, 53) type mismatch;
               found   : Null(null)
               required: T
               Note: implicit method foreignKeyType is not applicable here because it comes  after the application point and it lacks an explicit result type
def test[T<:AnyRef](o :Option[T]) :T = o getOrElse null
                                                   ^

2 个答案:

答案 0 :(得分:9)

Null是所有引用类型的子类型,但T是AnyRef的子类型这一事实并不能保证T是引用类型 - 特别是,Nothing是AnyRef的子类型,它不包含null

如果添加下限,则代码有效:

def test[T >:Null <:AnyRef](o :Option[T]) :T = o getOrElse null;

有效:

scala> def test[T >:Null <:AnyRef](o :Option[T]) :T = o getOrElse null;
test: [T >: Null <: AnyRef](o: Option[T])T

scala> 

scala> 

scala> test(None)
res0: Null = null

scala> test(Some(Some))
res1: Some.type = Some

答案 1 :(得分:2)

我不知道为什么这不起作用 - Null是Scala中所有引用类型的子类型,因此您可以期望这适用于任何T <: AnyRef。您可以使用asInstanceOf

def test[T <: AnyRef](o: Option[T]): T = o getOrElse null.asInstanceOf[T]

(尽量避免在Scala中使用null - 我可以想象你有一个合法的用例,例如当你需要将数据传递给Java代码时。)

顺便说一下,Option有一个方法orNull,如果它是Some,它将返回一个选项的值,如果是null,则返回None }。