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 podklasyPoint
.
Dlaczego to powoduje błąd, a nie tylko w instanceof
zwraca false?
Dzięki,
JDelage
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