scala - null 作为类型参数的实例

标签 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 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
                                                   ^

最佳答案

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

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

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

关于scala - null 作为类型参数的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27399205/

相关文章:

scala - 如何使用 spark scala 以附加模式在单个 JSON 文件下保存多个查询的输出

list - 当您将相互链接的对象影响到此列表时如何维护不可变列表

java - 返回子类对象的通用 getter

java - 具有类型混淆的自定义 Java 迭代器

java - 使用 boolean 值 = null 执行条件时出错

sql - 检查所有三列是否不为空或为空

scala - 如何使 Scala 解析器失败

java - 在 scala 应用程序中处理 swing 异常

在两种类型之间进行转换的 Java 通用实用方法

mysql - 外键约束。子表可以有空值吗?错误 1452 (23000)