2010-12-16 5 views
6

Czytam to:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2Dlaczego występuje błąd "instanceof" zamiast zwracania "false", gdy jest on używany dla 2 niekompatybilnych klas?

Mówią:

Rozważmy przykład program:

class Point { int x, y; } 
class Element { int atomicNumber; } 
class Test { 
     public static void main(String[] args) { 
       Point p = new Point(); 
       Element e = new Element(); 
       if (e instanceof Point) {  // compile-time error 
         System.out.println("I get your point!"); 
         p = (Point)e;   // compile-time error 
       } 
     } 
} 

Wyrażenie instanceof jest błędna, ponieważ nie instancją Element lub którejkolwiek z jego możliwych podklas (nie ma tutaj) może być instancją dowolnej podklasy Point.

Dlaczego to powoduje błąd, a nie tylko w instanceof zwraca false?

Dzięki,

JDelage

+0

Wygląda na to, że poprzednie doświadczenia mogą dotyczyć języków, które są w większości luźno napisane i najczęściej interpretowane (np. Większość BASIC-ów), w przeciwieństwie do silnie wpisanych i skompilowanych. W przypadku języka, który jest w większości interpretowany, prawie wszystkie typy sprawdzania poprawności występują w czasie wykonywania. Jednak w kompilowanych językach kompilator jest w stanie wykonać całkiem sporo "analizy przepływu typu i wykonania". W wyniku tego, jeśli znajdzie ścieżki, które nigdy nie zostaną wykonane, może usunąć kod z tej ścieżki (tj. Usunięcie martwego kodu). I generuje błąd, jeśli znajdzie operację, która nigdy nie może się powieść. – chaotic3quilibrium

Odpowiedz

10

instanceof sprawdzianem jest sprawdzenie czasu wykonywania. Kompilator może wykryć, że ten warunek jest nieprawidłowy w czasie kompilacji (znacznie wcześniej), więc mówi, że jest on nieprawidłowy. Zawsze pamiętaj, że nieudany post jest dobrą praktyką, zaoszczędzi ci to dużo czasu i nerwów.

+1

Dziękuję - to wyjaśnia racjonalne uzasadnienie tej decyzji. Całkowicie ma to sens w przypadku błędu podczas kompilacji, zamiast mieć wynik "fałszywy" w czasie wykonywania. – JDelage

10

Powiedziałbym, bo wiesz, że w czasie kompilacji, że nigdy nie będzie prawdą. Dlatego można bezpiecznie założyć, że to nie jest to, co programista miał na myśli :)

Prawdopodobnie istnieje jednak więcej wyjaśnień technicznych w języku Java.

3

Ponieważ kompilator wie, że element nie może być punktem, więc pojawia się błąd kompilacji.

0

Z powodu drzewa dziedziczenia. jeśli A odziedziczone B wtedy można napisać instancję B

Integer i = 3; 

System.out.println(i instanceof String); // compile time error 

System.out.println(i instanceof Number); // true 

System.out.println(i instanceof Object); // true 
Powiązane problemy