Я знаю, что instanceof возвращает TRUE, когда объект является экземпляром определенного класса. Например:
B extends A
C extends A
B b = new B();
C c = new C();
b instanceof A // returns TRUE
Пока все хорошо, поэтому давайте введем что-нибудь, что, казалось бы, должно возвращать false:
c instanceof B // won't compile (error: inconvertible types)
Это не компилируется, что имеет смысл, поскольку позволяет выявить недосмотр во время компиляции. Но когда действительно instanceof возвращает false? Кажется, есть только два варианта: ИСТИНА и ОШИБКА. Единственное исключение, о котором я могу думать, это следующее:
null instanceof A // returns FALSE
Но по той же логике, что и выше, казалось бы, это также должно быть обнаружено во время компиляции.
Что мне здесь не хватает? Являются ли true / error единственными практическими вариантами, или возможно ли действительно вернуть false более значимым образом, кроме случаев, когда в качестве ссылочной переменной задано значение null?
(Object)c instanceof B
будет компилироваться. Причина, по которойc instanceof B
не компилируется, заключается в том, что компилятор может статически определить, что ссылка наC
никогда не может бытьB
. - person Radiodef   schedule 23.01.2014