8

私は次のScalaコードを持っています:

class X[T1 <: AnyRef] {
   var _x : T1 = null 
}

コード _x = null がエラーとして強調表示されます。

error: type mismatch;
found   : Null(null)
required: T1
var _x : T1 = null : T1

Null 型の制約を追加すると、すべて正常に動作します。なぜこれが起こるのですか?Scala では AnyRef を java.lang.Object と同等のものとして定義していますが、これはもちろん nullable です。

4

4 に答える 4

11

それ以外の

var _x : T1 = null

使用する

var _x : T1 = _

Scala言語仕様からの説明:

変数定義 var x: T = _ は、テンプレートのメンバーとしてのみ表示できます。タイプ T とデフォルトの初期値を持つ可変フィールドを導入します。デフォルト値は、次のようにタイプ T によって異なります。

T が Int またはそのサブレンジ型の 1 つである場合は 0、
T が Long の場合は 0L、
T が Float の場合は
0.0f、T が Double の場合は 0.0d、
T が Boolean の場合は false、
T が Unit の場合は ()、
その他すべての型の場合は null T.

于 2012-06-26T21:12:22.267 に答える
9
class X[T1 <: AnyRef] {
   var _x : T1 = null 
}

nullable にしたい場合は、 に置き換えT1 <: AnyRefますT1 >: Null

なぜこれが起こるのですか?

NothingのサブタイプでありAnyRefNothingnull 許容ではありません。

于 2012-06-27T15:51:51.763 に答える
2

If you want to enforce that the generic parameter must be nullable, then you can set a lower-bound to the Null type:

class X[T1 >: Null] {
   var _x : T1 = null
}
于 2013-04-04T21:44:07.090 に答える
-1

完全を期すために、Scala で null を使用することは少しお勧めできません。null を使用する正当な理由がない限り、通常は Option で変数をラップします。詳細については、オプションを参照してください。

于 2012-06-26T21:34:13.880 に答える