Более вопиющим воплощением вашей проблемы является следующее:
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) aString
- Поэтому и вы не можете сделать
aString instanceof Cloneable