将null强制转换为Scala中case类的实例

将null强制转换为Scala中case类的实例,scala,generics,scala-2.11,Scala,Generics,Scala 2.11,我有一段代码,它依赖于某个case类的任意元素的存在,以便对该类的字段进行操作。尽管几乎每个Scala博客都建议永远不要使用null,但在类型级编程中这似乎不是一个糟糕的主意(例如,这个答案:)。然而,这段代码直接将null强制转换到特定的case类是不起作用的,也不会抛出错误,我对原因很感兴趣 trait V{} 案例类别W(x:Int)扩展了V val y=null.asInstanceOf[W] 火柴{ 案例w:w=>println(“对w的null转换为w”) case=>println

我有一段代码,它依赖于某个case类的任意元素的存在,以便对该类的字段进行操作。尽管几乎每个Scala博客都建议永远不要使用
null
,但在类型级编程中这似乎不是一个糟糕的主意(例如,这个答案:)。然而,这段代码直接将
null
强制转换到特定的case类是不起作用的,也不会抛出错误,我对原因很感兴趣

trait V{}
案例类别W(x:Int)扩展了V
val y=null.asInstanceOf[W]
火柴{
案例w:w=>println(“对w的null转换为w”)
case=>println(“对W的null强制转换不是W”)
}
//打印“空转换为W不是W”
火柴{
案例v:v=>println(“对W的null转换为v”)
case=>println(“对W的null转换不是V”)
}
//打印“零转换为W不是V”
val z=W(1)
z匹配{
案例w:w=>println(“实例化的w是w”)
案例=>println(“实例化的W不是W”)
}
//打印“实例化的W是W”
z匹配{
案例v:v=>println(“实例化的W是v”)
案例=>println(“实例化的W不是V”)
}
//打印“实例化的W是V”

强制转换更改编译时类型,而不是运行时类型。模式匹配检查运行时类型。事实上,case类模式匹配甚至有一个null的显式检查;请参阅(尽管该检查不会影响您的案例,因为您使用的是类型模式)


此外,即使没有模式匹配问题,您也无法“对类的字段进行操作”,而不会得到NullPointerException

强制转换更改编译时类型,而不是运行时类型。模式匹配检查运行时类型。事实上,case类模式匹配甚至有一个null的显式检查;请参阅(尽管该检查不会影响您的案例,因为您使用的是类型模式)

此外,即使没有模式匹配问题,您也无法“对类的字段进行操作”,而不会得到NullPointerException

因为它们是这样定义的:

  • 对类
    C
    p.C
    T#C
    的引用。此类型模式匹配给定类的任何非null实例
因此:
null
是类型为
W
的完全有效的值;但是它不会被模式
w:w
匹配

而不匹配的主要原因正是

我有一段代码,它依赖于某个case类的任意元素的存在,以便对该类的字段进行操作

因此,当您与
w:w
进行匹配时,您希望知道其字段和方法是否可用。但对于
null
而言,它们不是。

,因为它们是这样定义的:

  • 对类
    C
    p.C
    T#C
    的引用。此类型模式匹配给定类的任何非null实例
因此:
null
是类型为
W
的完全有效的值;但是它不会被模式
w:w
匹配

而不匹配的主要原因正是

我有一段代码,它依赖于某个case类的任意元素的存在,以便对该类的字段进行操作


因此,当您与
w:w
进行匹配时,您希望知道其字段和方法是否可用。但是对于
null
它们不是。这不是类型级编程,因此建议避免
null
。使用
选项
。这不是类型级编程,因此建议避免
null
无效。使用
选项