0

以下は、Scala で有効なステートメントです。

scala> var x: Option[Int] = Some(3)
x: Option[Int] = Some(3)

scala> var x: Option[Int] = None
x: Option[Int] = None

以下は無効です。

scala> var x: Option[Int] = 3
<console>:7: error: type mismatch;
 found   : Int(3)
 required: Option[Int]
       var x: Option[Int] = 3

これまでのところ、これらの例は私には理にかなっています。Option[T] 型の値は、Some[T] 型または None 型のいずれかになる可能性があるため、コンパイラは、どちらの型でもない値を割り当てることを防ぎます。

ただし、Scala コンパイラはこれを受け入れるようです。

scala> val x: Option[Int] = null
x: Option[Int] = null

その後、オプションでパターン マッチを実行しようとすると (たとえば、以下のように)、予期しないエラーが発生します。

x match {
  case Some(y) => println("Number: ", y)
  case None => println("No number")
}
4

2 に答える 2

7

Scala クラス階層を見ると、から派生するすべてのクラスAnyRefが のスーパー クラスでありNull、そのようなスーパー クラスには値 を割り当てることができることがわかりますnull。はそのようなクラスの 1 つであるため、それOptionに割り当てることができますNull

SomeNone.type(つまり、Noneオブジェクトのシングルトン型) の両方が のスーパー クラスでNullあるため、nullはどちらにも有効な値であることに注意してください。

(明らかに)のサブクラスの値ではないため、に割り当てることはできません3Option3Option

于 2013-08-24T06:02:31.440 に答える
0

おそらくあなたが尋ねようとしていた質問への答えは、次のようになります。

慣用的な Scala は決して使用しませんnull。ヌル参照は、Java およびその他の JVM 言語との相互運用性のためにのみ存在します。Scala コードで見ればnull、すぐに精査されるはずです。間違って使用することはないnullため、コンパイラの警告は不要です。ダニエル・ソブラルの回答とコメントに記載されているように、コンパイラは に対して保護を提供できませんnull

于 2013-08-24T13:43:38.230 に答える