Почему «instanceof» выдает ошибку, а не возвращает «false», когда используется для 2 несовместимых классов? - PullRequest
7 голосов
/ 16 декабря 2010

Я читаю это:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2

Они говорят:

Рассмотрим пример программы:

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
                }
        }
}

Выражение instanceof является неправильным, поскольку ни один экземпляр Element или любой из его возможных подклассов (здесь не показан ни один) не может быть экземпляром любого подкласса Point.

Почему это приводит к ошибке, а не просто к instanceof возвращению false?

Спасибо,

JDelage

Ответы [ 4 ]

10 голосов
/ 16 декабря 2010

instanceof проверка - проверка во время выполнения.Компилятор может обнаружить, что это условие неверно во время компиляции (намного раньше), поэтому он говорит вам, что это неправильно.Всегда помните, что неудачный пост - хорошая практика, она сэкономит вам много времени и нервов.

10 голосов
/ 16 декабря 2010

Я бы сказал, потому что во время компиляции вы знаете, что это никогда не будет правдой.Поэтому можно с уверенностью предположить, что это не то, что имел ввиду программист

3 голосов
/ 16 декабря 2010

Поскольку компилятор знает, что элемент не может быть точкой, вы получаете ошибку компиляции.

0 голосов
/ 16 декабря 2010

Из-за дерева наследования. если A унаследован от B, то вы можете написать A экземпляр 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
...