Для чего используется instanceof
оператор? Я видел такие вещи, как
if (source instanceof Button) {
//...
} else {
//...
}
Но все это не имело смысла для меня. Я провел свое исследование, но придумал только примеры без каких-либо объяснений.
java
instanceof
Бен
источник
источник
instanceof
переопределениюequals
?Ответы:
instanceof
Ключевое слово - это двоичный оператор, используемый для проверки, является ли объект (экземпляр) подтипом данного Типа.Представить:
Представьте себе
dog
объект , созданный с помощьюObject dog = new Dog()
:Тем не менее, с
Object animal = new Animal();
,потому что
Animal
это супертипDog
и, возможно, менее "изысканный".И,
Это потому, что не
Dog
является ни подтипом, ни супертипомCat
, и он также не реализует его.Обратите внимание, что переменная, используемая для
dog
выше, имеет типObject
. Это показывает,instanceof
что это операция во время выполнения и приводит нас к варианту использования: реагировать по-разному в зависимости от типа объекта во время выполнения .На что обратить внимание:
expressionThatIsNull instanceof T
ложно для всех типовT
.Удачного кодирования.
источник
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Это прекрасно компилирует и печатаетfalse
. Компилятору не разрешается определять во время компиляции, чтоdog
не может быть Cat (согласно правилам в JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. Дело не в том,if (literal instanceof Something)
что вы, похоже, предполагаете.Object dog
часть. Виноват!dog instanceof Cat // does not even compile!
(потому что это класс). Если быCat
был интерфейс, то он был бы скомпилирован.Это оператор, который возвращает true, если левая часть выражения является экземпляром имени класса с правой стороны.
Подумайте об этом таким образом. Скажем, все дома в вашем квартале были построены из одинаковых чертежей. Десять домов (объектов), один набор чертежей (определение класса).
instanceof
это полезный инструмент, когда у вас есть коллекция объектов, и вы не уверены, что они есть. Допустим, у вас есть коллекция элементов управления в форме. Вы хотите прочитать проверенное состояние всех имеющихся флажков, но вы не можете запросить простой старый объект для его проверенного состояния. Вместо этого вы увидите, является ли каждый объект флажком, и если он есть, приведите его к флажку и проверьте его свойства.источник
instanceof
может сделать его безопасным для подавления.Как описано на этом сайте :
Надеюсь, это поможет!
источник
Этот оператор позволяет определить тип объекта. Возвращает
boolean
значение.Например
выход:
источник
Если
source
этоobject
переменная,instanceof
это способ проверить, является ли онаButton
или нет.источник
Как упоминалось в других ответах, каноническое типичное использование
instanceof
для проверки, относится ли идентификатор к более конкретному типу. Пример:Однако обратите внимание, что тип левого выражения должен быть родительским типом правого выражения (см. JLS 15.20.2 и Java Puzzlers, # 50, pp114 ). Например, следующее не удастся скомпилировать:
Это не в состоянии скомпилировать с сообщением:
Как
Test
не родительский классString
. OTOH, это прекрасно компилируется и печатается,false
как и ожидалось:источник
источник
Может использоваться как сокращение в проверке равенства.
источник
Большинство людей правильно объяснили «Что» в этом вопросе, но никто не объяснил «Как» правильно.
Итак, вот простая иллюстрация:
Выходы:
Причина ошибки компилятора при сравнении
s
со StringBuffer хорошо объяснена в документации :что подразумевает, что LHS должен быть либо экземпляром RHS, либо класса, который либо реализует RHS, либо расширяет RHS.
Как использовать использовать instanceof тогда?
Поскольку каждый класс расширяет объект, приведение типов LHS к объекту всегда будет работать в вашу пользу:
Выходы:
источник
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, так как мы типизируем s для Object?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
источник
Экземпляр ключевого слова полезен, когда вы хотите узнать экземпляр конкретного объекта.
Предположим, что вы выбросили исключение, и когда у вас есть catch, затем выполните пользовательскую операцию sum, а затем снова продолжите согласно вашей логике (throws или log и т. Д.)
Пример: 1) Пользователь создал пользовательское исключение «InvalidExtensionsException» и выбросил его согласно логике
2) Теперь в блоке catch catch (Exception e) {выполнить логику суммы, если тип исключения "InvalidExtensionsException"
3) Если вы не проверяете экземпляр, а типом исключения является исключение нулевого указателя, ваш код сломается.
Таким образом, ваша логика должна быть внутри экземпляра if (e instanceof InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }
Вышеприведенный пример - неправильная практика кодирования. Однако этот пример поможет вам понять использование его экземпляра.
источник
Лучшее объяснение - JLS . Всегда пытайтесь проверить, что говорит источник. Там вы получите лучший ответ и многое другое. Воспроизведение некоторых частей здесь:
источник
Оператор java
instanceof
используется для проверки того, является ли объект экземпляром указанного типа (класс, подкласс или интерфейс).Instanceof в java также известен как тип,
comparison operator
поскольку он сравнивает экземпляр с типом. Возвращает либоtrue
илиfalse
. Если мы применяемinstanceof
оператор с любой переменной, которая имеетnull
значение, он возвращаетfalse
.Из JDK 14+, который включает в себя JEP 305, мы также можем выполнить «Сопоставление с образцом» для
instanceof
Шаблоны в основном проверяют, что значение имеет определенный тип, и могут извлекать информацию из значения, когда оно имеет соответствующий тип. Сопоставление с образцом позволяет более четко и эффективно выражать общую логику в системе, а именно условное удаление компонентов из объектов.
До Java 14
Улучшения Java 14
Мы также можем объединить проверку типа и другие условия вместе
Использование сопоставления с образцом в
instanceof
должно уменьшить общее число явных приведений в программах Java.PS :
instanceOf
будет соответствовать только тогда, когда объект не нулевой, тогда только ему можно присвоитьstr
.источник
источник
Очень простой пример кода:
Будьте осторожны здесь. В приведенном выше примере, если Class1 - Object, первое сравнение всегда будет истинным. Так что, как и с исключениями, иерархический порядок имеет значение!
источник
Вы можете использовать карту, чтобы сделать более высокую абстракцию в случае
Затем, имея такую карту, добавьте к ней некоторые действия:
Затем, имея Объект неизвестного типа, вы можете получить конкретное действие с этой карты:
источник
Оператор instanceof используется для проверки того, является ли объект экземпляром указанного типа. (класс или подкласс или интерфейс).
Instanceof также известен как оператор сравнения типов, потому что он сравнивает экземпляр с типом. Возвращает либо true, либо false.
Если мы применяем оператор instanceof к любой переменной, которая имеет нулевое значение, она возвращает false.
источник