我定义了以下类
private sealed trait Action2[-T1, +R] extends Function1[T1, R] {
def printResults()
}
private abstract class BaseAction[T1, R] extends Action2[T1, R]{
protected var result: R = null
override final def apply(values: T1) : R = {
result = evaluate(values)
result
}
override final def printResults() {
if(result == null)
print("The results have not been evaluated!")
else
printLazyResults(result)
}
protected[this] def printLazyResults(results: R)
protected[this] def evaluate(values: T1) : R
}我有一个这个类的实现,每当我尝试实例化给定的实现时,方法:
implicit def unMkIdentity[A](x: Identity[A]): A = x.value抛出空指针异常。首先,我不明白为什么要调用它(我导入scalaz和Scalaz),以及为什么它从属性result中获取空值……
发布于 2012-08-17 21:48:08
通常,像class X[R] { var r: R = null }这样的定义会给你带来麻烦
scala> class X[R] { var r: R = null }
<console>:7: error: type mismatch;
found : Null(null)
required: A
class X[R] { var r: R = null }在这种情况下,发生了一些奇怪的事情,允许您的代码进行编译:编译器发现它在unMkIdentity中有一个隐式的Identity[R] => R,因此它将null解释为Identity[R]的一个实例,并尝试进行转换,这当然不起作用。
这不是故意的行为--这只是一个奇怪的小结果,因为周围有很多隐含的东西。
在任何情况下,您都不应该编写var r: R = null来初始化成员变量-您应该始终使用var r: R = _,它会选择一个合适的默认值。有关更多信息,请参阅the language specification的4.2节(“变量声明和定义”)。
https://stackoverflow.com/questions/12003284
复制相似问题