Scala null作为类型参数的实例

Scala null作为类型参数的实例,scala,generics,null,type-parameter,Scala,Generics,Null,Type Parameter,好的,我知道不应该使用空值作为设计选项,但在这种情况下,我必须这样做。为什么下面的代码不编译 def test[T<:AnyRef](o :Option[T]) :T = o getOrElse null Error:(19, 53) type mismatch; found : Null(null) required: T Note: implicit method foreignKeyTyp

好的,我知道不应该使用空值作为设计选项,但在这种情况下,我必须这样做。为什么下面的代码不编译

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
                                                   ^

def测试[T我不知道为什么这不起作用-
Null
是Scala中所有引用类型的子类型,因此您可以预期这将适用于任何
TNull是所有引用类型的子类型,但事实上T是AnyRef的子类型并不保证T是引用类型——特别是,没有任何东西是AnyRef wh的子类型ich不包含null

如果添加下限,则代码可以正常工作:

def test[T >:Null <:AnyRef](o :Option[T]) :T = o getOrElse null;
def测试[T>:空def测试[T>:空:空
斯卡拉>
scala>测试(无)
res0:Null=Null
scala>测试(一些(一些))
res1:Some.type=Some

如果使用参数None调用,这将是NPE。在REPL中,但这可能是REPL的副作用。在REPL中尝试此方法:
测试(None:Option[String])
你是对的。不过,使用>:Null而不是为什么不使用
Option.orNull的解决方案?这是我的第一选择,但当它不起作用时(由于下面答案中给出的原因)我试图使示例更简单。下限是必需的,因为
什么都没有
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