Следующие компилируемые файлы:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Но это не так:
String s = new String();
System.out.println(s instanceof Cloneable);
Ошибка компилятора.
В чем проблема?
Следующие компилируемые файлы:
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 - это последний классString не реализует Cloneable(Cloneable) aStringaString instanceof CloneableСвязанная с этим проблема, с которой я столкнулся недавно (и которая привела меня на эту страницу, прежде чем я выяснил, что происходит), заключается в том, что среда Eclipse может ошибочно сообщать "Несовместимые условные типы операндов" в выражении "instanceof" из-за отсутствующего оператора "import" для типа справа от "instanceof". Я потратил некоторое время, пытаясь понять, как типы, о которых идет речь, могут быть несовместимыми, прежде чем выяснять, что недостающий импорт вызывает всю проблему. Надеюсь, эта информация немного спасет кого-нибудь.
Компилятор знает, что String является окончательным классом и не реализует Cloneable. Таким образом, ни один экземпляр String никогда не может быть экземпляром Cloneable. Это мешает вам подумать, что у вас есть осмысленный тест, когда на самом деле он всегда будет печатать "ложь".