instanceof - несовместимые условные типы операндов - PullRequest
52 голосов
/ 31 марта 2010

отлично компилируется:

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

Но это не так:

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

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

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

Ответы [ 3 ]

151 голосов
/ 04 января 2012

Связанная проблема, с которой я недавно столкнулся (и которая привела меня на эту страницу, прежде чем я понял, что происходит), заключается в том, что среда Eclipse может сообщать «Несовместимые типы условных операндов» в выражении «instanceof» ошибочно из-за отсутствия оператора import для типа справа от instanceof. Я потратил некоторое время, пытаясь выяснить, как рассматриваемые типы могут быть несовместимыми, прежде чем выяснить, что отсутствие импорта вызывает всю проблему. Надеюсь, эта информация сэкономит кому-то время.

49 голосов
/ 31 марта 2010

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

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
28 голосов
/ 31 марта 2010

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

...