0

scala docsによると:

Null はすべての参照型のサブタイプです。

したがって、理論的には、この例でNullは、 が (参照型) のサブタイプであり、 type のインスタンスでメソッドFooを呼び出せるはずであると想定できます。実際にはできず、コード スニペットはコンパイル時にエラーで失敗します。barNullvalue bar is not a member of Null


case class Foo(bar: String)

val n: Null = null
n.bar

それを試してみてください


scala docs にもあるよう に、コンパイル時にこれをキャッチすることは理にかなっていると[Null's] only instance is the null reference思いますが、より良いエラーメッセージはCalling bar on type Null can only result in a NullPointerException.

私の質問は、コンパイル時に失敗せず、代わりに実行時に失敗する次のコード スニペットに関するものです。NullPointerException


val n: Null = null
n.toString

それを試してみてください


これは、 Null 型が他のすべての参照型を真にサブクラス化せず、サブクラスのみをサブクラス化するためであると想定していAnyRefますが、このコードでのみ発生する可能性があるというコンパイル時エラー (または少なくとも警告) をスローしてはならない理由はありますか? NullPointerException? _ 呼び出しnull.barnull.toString動作が異なるのは意図的ですか?

4

1 に答える 1

0

Null is a subtype of all reference types;- これは次のような意味です:

val n: Foo = null
n.bar //throws NPE

val a: String = null
a.charAt(0) //NPE again

Nullしたがって、すべての参照型のサブタイプであると言えます。

編集

val n: Null = null 
n.bar 

の部分が間違っています。Scalaのドキュメントによると:

abstract final class Null extends AnyRef

AnyRefを持っていませんbar。このように言うことはできませんよね?

val n: AnyRef = ""
n.charAt(0) //won't compile
于 2013-10-04T10:15:30.627 に答える