2012-07-05 16 views

Odpowiedz

5

To naprawdę dziwne, ponieważ nie jest to zachowanie Oczekuje według specyfikacji:

asInstanceOf[T] zwraca sam obiekt null jeśli T zgodny scala.AnyRef i rzuca NullPointerException inaczej.

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

Jest to zamknięty, ale powiązany z known bug, który jest otwarty.

1

Wszystkie te typy rozszerzają się na AnyVal, dla których wartość nie może być pusta przez przypisanie, dlatego powoduje, że zmienia się w zero w odpowiedzi na AsInstanceOf, jednak umyka mi. Wydaje się, że robi to tylko w REPL, co jest dość nietypowym przypadkiem. W prawdziwym kodzie zwraca wartość null.

+0

ja nie spróbować w „prawdziwym” kodu przez siebie, ale jest to zachowanie mój kolega zauważył w „prawdziwym” kodu. – Michael

3

Powodem jest to, że null jest typem odniesienia - rzutowanie zawsze konwertuje na inny typ odniesienia - w tym przypadku w pudełkowej wersji Int lub Double.

W następnym kroku kompilator konwertuje obiekt w ramce na wartość pierwotną. Jeśli obiekt o pudełku Int jest null, jego odpowiednią domyślną wartością domyślną jest 0.

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

+0

Dzięki. Czy jest zgodny ze specyfikacją językową? – Michael

+0

nie jesteś pewien co do części z konwersją między wartościami domyślnymi. – axel22

+0

Tak, wygląda na to, że ta część jest sprzeczna ze specyfikacją (patrz odpowiedź Nicolasa) – Michael