3

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

class MyLinkedList[T](h: T, tail: MyLinkedList[T]) {
    def prepend(v: T): MyLinkedList[T] = new MyLinkedList(v, this) 
}

2番目のパラメーターをnullとして渡すことができ、それが機能するのはどうしてだろうか:

val l: MyLinkedList[Int] = new MyLinkedList(1, null)

nullは MyLinkedList[Int] のインスタンスですか?? いいえ:

println(null.isInstanceOf[MyLinkedList[Int]])

出力しますfalse

なぜ?

4

3 に答える 3

5

このブログ投稿では、Scala で ( 、、および とnull一緒に)うまく説明しています。NullNilNothingNone

Nullこれは (特性に慣れていない場合)、Java の抽象クラスのようなものです。のインスタンスが 1 つだけ存在しNull、それが ですnull。それほど難しくありません。リテラルnullは、Java と同じ目的を果たします。どのオブジェクトも参照していない参照の値です。したがって、 type のパラメーターを受け取るメソッドを作成する場合、Null渡すことができるのは、nullそれ自体または type の参照の2 つだけNullです。

したがってnull、Scala 型システムでは 以外の型のインスタンスではありませんNull

scala>  null.isInstanceOf[Any]
res1: Boolean = false

OK、それは then のインスタンスに違いありませんNullよね? 良い...

scala>  null.isInstanceOf[Null]
<console>:8: error: type Null cannot be used in a type pattern or isInstanceOf test
       null.isInstanceOf[Null]

全体として、他の人が指摘したように、 JavaNullnullの下位互換性のためにのみ存在します。それ以外の場合Nullは と同じステータスNothingですが、後者にはインスタンスがなく、空のコレクションの定義や異常終了など、特定の使用シナリオで明確に定義された役割があるため、Scala 型システムのより有機的な部分です。関数呼び出しから。

于 2013-01-07T21:20:02.100 に答える
4

nullJVM および .NET フレームワークで実行される他の言語との逆互換性のために Scala でサポートされているものです。言語設計者は特に興奮していませんが、Java コードと同じようにコンパイルされます。ネイティブな Scala の状況では絶対に使用しないでください。Scala は、null オプションを許可する必要がある場合にOption備えて、インスタンスSomeを使用するなど、None本質的にラッパーである代替手段を最も慣用的に提供します。Nullable

于 2013-01-07T20:08:33.183 に答える
0

これを見て

class A
println(null.isInstanceOf[A])  // false

理由isInstanceOfはわかりませんが、期待どおりに動作しないようnullです。型チェックを行う別の方法は、

null: MyLinkedList[Int]

動作します。

于 2013-01-07T20:42:07.737 に答える