2017-11-16 20 views
0

タイプがNullかどうかチェックできないのはなぜですか?'Null'のインスタンスとしてタイプをチェックできないのはなぜですか

scala> val s:String = null 
s: String = null 

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

       ^
+0

の可能性のある重複した[Scalaの 'ヌル' は、別の型のインスタンスとしてカウントしていますか?](https://stackoverflow.com/questions/14203201/does-scala-null-count-as-an -instance-of-another-type) – Learner

答えて

3

x.isInstanceOf[C]の一般的な契約があればtrueを返すことで、xCのインスタンスである場合にのみ。何かのインスタンスとは、xがnullでないことを意味します。 xnullであることを起こる場合でも、インスタンスNullではありませんので、

その仕様によると、x.isInstanceOf[Null]は常に、falseを返す必要があります。コンパイラは、代わりにそのテストをコンパイルすることを拒否することによって、この混乱からあなたを守ります。

xnullであるかどうかをテストするための慣用的な方法は、あなたが明示的に参照等価性を見てみたいので、単に、

x == null 
1

nullとの等価性をチェックするために、より正しい方法を使用することです。

x eq null 
+1

'=='は可換です。なぜなら、 'equals'は可換でなければならないからです。したがって、 'x == null'は常に' null == x'と同じです。これは定義上 'x eq null'と等価です。したがって、 'x == null'も' x eq null'と同じです。私が見たScalaのコードベースから、 'x == null'はより慣用的です。 – sjrd

+1

@sjrd正しいですが、 'x eq null'がより効率的です。 _Scala_ sourcesからの引用:_式x == thatは、if(x eq null)と等価であり、eq null以外のx.equals(that) '_と等価です。したがって、 'x == null'は' if(x eq null)null eq null else ... 'になります。' null'との比較は、値の等価ではなく明示的な参照の等価であるため、 'eq'は' == '、IMHO。 –

+0

@sjrdさらに、_Scala_の_GitHub_リポジトリで '' eq null ''(二重引用符で)を検索すると、' eq'で行われた 'null'への比較の例がたくさん表示されます。だから、 '=='がもっと慣れ親しんでいるというあなたの主張が正当であるかどうかは分かりません。 –

関連する問題