2012-07-05 2 views
6

Можно создать дубликат:
If an Int can't be null, what does null.asInstanceOf[Int] mean?Кастинг нуль в Int и Double в Scala

Я попробовал следующее РЕПЛ:

scala> null.asInstanceOf[Int] 
res12: Int = 0 

scala> null.asInstanceOf[Float] 
res13: Float = 0.0 

scala> null.asInstanceOf[Double] 
res14: Double = 0.0 

Было бы ожидать исключение во время выполнения (NPE или ClassCastException) в этом случае.
Может кто-нибудь объяснить почему Scala отличает null к нулю?

ответ

5

Это действительно странно, так как это не ожидаемое поведение в соответствии со спецификацией:

asInstanceOf[T] возвращает сам объект null если T соответствует scala.AnyRef и бросает NullPointerException иначе.

- The Scala Language Specification, Version 2.9, p. 75.

И это known bug, замкнутый, но связан с this one, который открыт.

1

Эти типы все расширяют AnyVal, для которых значение не может быть пустым по назначению, причина, по которой он превращает их в ноль в ответ на asInstanceOf, однако ускользает от меня. Похоже, что это делается только в REPL, но это немного особый случай. В реальном коде он возвращает null.

+0

я не пробовал его в «реальном» код по себе, но это поведение мой коллега заметил в «реальном» кода. – Michael

3

Причина в том, что null является ссылочным типом - литье всегда преобразуется в другой ссылочный тип - в этом случае в коробке версии Int или Double.

На следующем этапе компилятор преобразует объект в штучной упаковке в примитивное значение. Если объект boxed Int равен null, его соответствующее стандартное значение по умолчанию - 0.

См: If an Int can't be null, what does null.asInstanceOf[Int] mean?

+0

Спасибо. Соответствует ли он языковой спецификации? – Michael

+0

не уверен в части с преобразованием значений по умолчанию. – axel22

+0

Да, похоже, эта часть противоречит спецификации (см. Ответ Николаса) – Michael

Смежные вопросы