【发布时间】:2016-01-03 13:07:08
【问题描述】:
scala> case class Data[+T](val value:T=null)
defined class Data
scala> val foo=Data[ArrayBuffer[Data[Any]]]()
foo: Data[scala.collection.mutable.ArrayBuffer[Data[Any]]] = Data(null)
scala> foo.value+=Data[String]()
java.lang.NullPointerException
... 33 elided
我想要一个 Data[String]、Data[ArrayBuffer[Data[Any]]] 或 Data[Map[String,Data[Any]]] 实例化的 Data 类。在上面的示例中,我尝试将其实例化为 Data[ArrayBuffer[Data[Any]]] 并将 Data[String] 添加到其数组缓冲区。当然我得到一个空指针异常,因为值是空的。但是这个例子的重点是它至少可以编译和运行。
现在,在 Data 构造函数中,我想根据初始 null 值的类型将值实例化为 Data[String]、ArrayBuffer[Data[Any]] 或 Map[String,Data[Any]]由 getClass 方法返回。但是为此,我需要将 value 设为 var,以便在检查其 null 值的类型后对其进行修改。
但是我得到了这个错误:
scala> case class Data[+T](var value:T=null)
<console>:11: error: covariant type T occurs in contravariant position in type T of value value_=
case class Data[+T](var value:T=null)
【问题讨论】:
-
您使用
null而非Option的任何原因? -
不要在 Scala 中使用
null。它实际上只存在于与 Java 的互操作性。请改用Option。使案例类可变是不好的做法;保持不变。