なぜこれが機能しないのですか?
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を使用しています
正確な理由はわかりませんが、アンダースコアの概念 ( type のデフォルト値のショートカットで、 object の場合は null ) は正常に機能します。
trait testtrait[T] {
var ob:T = _
}
より恐ろしい回避策がasInstanceOf
キャストされますが、アンダースコアがより良い代替手段であることがわかりました。
trait testtrait[T] {
var ob:T = null.asInstanceOf[T]
}
null
は type の値ですが、どの型もサブタイプとして持っているNull
わけではなく、 -派生のものだけです (もちろん を除く)。次のようなことをしたとします。Null
AnyRef
Nothing
object SomeObj extends testtrait[Int]
何SomeObj.ob
に等しくなければなりませんか?であるため、可能な値としてInt
はありません。null
他の回答で述べられているように、アンダースコア構文を使用してタイプのデフォルト値を設定する必要があります。
全タイプの中で一番下のタイプは ですNothing
。これはT
、他の制約を受けていない任意の型が である可能性がありNothing
、 でnull
はないことを意味しますNothing
(実際、値はありません)。
したがって、 を代入できるようにするにはnull
、それを記述する必要があります[T >: Null]
(T
は のスーパータイプですNull
)。
一方、を使用してデフォルト値に初期化できますvar ob: T = _
。ただし、 for any はボックス化され、たとえば 0 の代わりに割り当てられることに注意してAnyVal
くださいT
。null
これにより、予期しない結果が生じる可能性があります。