2

なぜこれが機能しないのですか?

trait testtrait[T] {
  var ob:T = null
}

次に、scalac testtrait.scala が生成します

testtrait.scala:2: error: type mismatch;
 found   : Null(null)
 required: T
  var ob:T = null
             ^
one error found

私はScala 2.9を使用しています

4

3 に答える 3

5

正確な理由はわかりませんが、アンダースコアの概念 ( type のデフォルト値のショートカットで、 object の場合は null ) は正常に機能します。

trait testtrait[T] {
  var ob:T = _
}

より恐ろしい回避策がasInstanceOfキャストされますが、アンダースコアがより良い代替手段であることがわかりました。

trait testtrait[T] {
  var ob:T = null.asInstanceOf[T]
}
于 2013-10-17T19:18:34.863 に答える
5

nullは type の値ですが、どの型もサブタイプとして持っているNullわけではなく、 -派生のものだけです (もちろん を除く)。次のようなことをしたとします。NullAnyRefNothing

object SomeObj extends testtrait[Int]

SomeObj.obに等しくなければなりませんか?であるため、可能な値としてIntはありません。null

他の回答で述べられているように、アンダースコア構文を使用してタイプのデフォルト値を設定する必要があります。

于 2013-10-17T20:17:23.587 に答える
2

タイプの中で一番下のタイプは ですNothing。これはT、他の制約を受けていない任意の型が である可能性がありNothing、 でnullはないことを意味しますNothing(実際、値はありません)。

したがって、 を代入できるようにするにはnull、それを記述する必要があります[T >: Null](Tは のスーパータイプですNull)。

一方、を使用してデフォルト値に初期化できますvar ob: T = _。ただし、 for any はボックス化され、たとえば 0 の代わりに割り当てられることに注意してAnyValくださいTnullこれにより、予期しない結果が生じる可能性があります。

于 2013-10-17T21:29:32.103 に答える