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

nullポインタ例外をスローします。最初にそれが呼び出される理由(scalazとScalazをインポートする)と、プロパティの結果からnull値を取得する理由がわかりません...

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に含まれていることを確認するため、をインスタンスとしてunMkIdentity解釈し、変換を試みますが、もちろん機能しません。nullIdentity[R]

これは意図された動作ではありません。多くの暗黙の問題が存在することによる奇妙な小さな結果にすぎません。

いずれの場合もvar r: R = null、メンバー変数を初期化するために書き込むことは絶対にしないでください。常にvar r: R = _、適切なデフォルト値を選択するを使用する必要があります。詳細については、言語仕様のセクション4.2(「変数の宣言と定義」)を参照してください。

于 2012-08-17T13:48:08.483 に答える