好吧,我知道比使用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
^
答案 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
}。