null as instance of a type parameter

寵の児 提交于 2019-12-23 20:36:53

问题


Ok, I know better than to use nulls as a design choice, but in this case I have to. Why the following does not compile?

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
                                                   ^

回答1:


Null is a subtype of all reference types, but the fact that T is a subtype of AnyRef doesn't guarantee that T is a reference type -- in particular, Nothing is a subtype of AnyRef which does not contain null.

Your code Works if you add a lower bound:

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

It works:

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



回答2:


I don't know why this does not work - Null is a subtype of all reference types in Scala, so you would expect that this would work with any T <: AnyRef. You can make it work with asInstanceOf:

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

(Try to avoid using null whenever possible in Scala - I can imagine you'd have a legitimate use case, for example when you need to pass data to Java code).

By the way, Option has a method orNull which will return the value of an option if it is a Some and null if it is None.



来源:https://stackoverflow.com/questions/27399205/null-as-instance-of-a-type-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!