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