1

我定义了以下类

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)以及为什么它从属性结果中获取空值......

4

1 回答 1

2

通常,您会遇到以下定义的麻烦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 }

在这种情况下,发生了一些奇怪的事情,允许您的代码编译:编译器看到它有一个隐含Identity[R] => R的 in unMkIdentity,因此它将 解释null为的实例Identity[R]并尝试进行转换,这当然不起作用。

这不是预期的行为——这只是周围有很多隐含的奇怪的小后果。

在任何情况下,您都不应该编写var r: R = null来初始化成员变量——您应该始终使用var r: R = _,它会选择一个适当的默认值。有关详细信息,请参阅语言规范的第 4.2 节(“变量声明和定义”)。

于 2012-08-17T13:48:08.483 回答