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

StackOverflow https://stackoverflow.com/questions/2551337

  •  23-09-2019
  •  | 
  •  

Вопрос

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

  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

Если актерский состав РеляционноеВыражение к Тип ссылки будет отклонено как ошибка времени компиляции, тогда instanceof реляционное выражение также приводит к ошибке времени компиляции.В такой ситуации результат instanceof выражение никогда не могло быть правдой.

То есть, поскольку это выражение приведения генерирует ошибку во время компиляции:

(Number) "foo"

то же самое относится и к этому выражению:

("foo" instanceof Number)

Ваш случай немного более тонкий, но принцип тот же:

  • String это последний урок
  • String не реализует Cloneable
  • Поэтому вы не можете сделать (Cloneable) aString
  • Поэтому вы также не можете сделать aString instanceof Cloneable

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top