Следующие прекрасные компиляции:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Но это не делает:
String s = new String();
System.out.println(s instanceof Cloneable);
Ошибка компилятора брошена.
В чем проблема?
Более вопиющим воплощением вашей проблемы является следующее:
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
Это указано в JLS 15.20.2 Оператор сравнения типов instanceof
:
RelationalExpression: RelationalExpression instanceof ReferenceType
Если приведение RelationalExpression к ReferenceType будет отклонен как ошибка времени компиляции, тогда реляционное выражение
instanceof
также вызовет ошибку времени компиляции. В такой ситуации результат выраженияinstanceof
никогда не может быть истинным.
То есть, поскольку это выражение приведения генерирует ошибку времени компиляции:
(Number) "foo"
, так должно быть и это выражение:
("foo" instanceof Number)
Ваш случай немного более тонкий, но принцип тот же:
String
is последний класс String
не реализует Cloneable
(Cloneable) aString
aString instanceof Cloneable
Компилятор знает, что String
является последним классом и не реализует Cloneable
. Таким образом, ни один экземпляр String не может никогда быть экземпляром Cloneable
. Это мешает вам думать, что у вас есть значимый тест, хотя на самом деле он всегда будет выводить «false».