instanceof - несовместимые условные типы операнда

Следующие прекрасные компиляции:

  Object o = new Object();
  System.out.println(o instanceof Cloneable);

Но это не делает:

  String s = new String();
  System.out.println(s instanceof Cloneable);

Ошибка компилятора брошена.

В чем проблема?

54
задан SyntaxT3rr0r 30 March 2010 в 21:15
поделиться

2 ответа

Более вопиющим воплощением вашей проблемы является следующее:

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
52
ответ дан 7 November 2019 в 07:34
поделиться

Компилятор знает, что String является последним классом и не реализует Cloneable . Таким образом, ни один экземпляр String не может никогда быть экземпляром Cloneable . Это мешает вам думать, что у вас есть значимый тест, хотя на самом деле он всегда будет выводить «false».

28
ответ дан 7 November 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: