instanceof
может использоваться для проверки того, является ли объект прямым или уменьшенным экземпляром данного класса. instanceof
также может использоваться с интерфейсами, даже если интерфейсы не могут быть созданы как классы. Может ли кто-нибудь объяснить, как работает instanceof
?
Как instanceof будет работать на интерфейсе
Ответ 1
Прежде всего, мы можем хранить instances
классов, которые реализуют конкретный interface
в interface reference variable
, как это.
package com.test;
public class Test implements Testeable {
public static void main(String[] args) {
Testeable testeable = new Test();
// OR
Test test = new Test();
if (testeable instanceof Testeable)
System.out.println("instanceof succeeded");
if (test instanceof Testeable)
System.out.println("instanceof succeeded");
}
}
interface Testeable {
}
т.е. любой экземпляр времени выполнения, реализующий конкретный интерфейс, пройдет тест instanceof
ИЗМЕНИТЬ
и выход
instanceof succeeded
instanceof succeeded
@RohitJain
Вы можете создавать экземпляры интерфейсов с помощью анонимных внутренних классов, таких как
Runnable runnable = new Runnable() {
public void run() {
System.out.println("inside run");
}
};
и вы проверяете, что экземпляр имеет интерфейс типа, используя оператор instanceof
, подобный этому
System.out.println(runnable instanceof Runnable);
и результат равен "true"
Ответ 2
object instanceof object_interface
даст true
.
Ответ 3
Вы выполняете проверку instanceof
reference
на instance
и проверяете тип instance
, на который указывает именно reference
.
Теперь, поскольку вы можете создать ссылку interface
, которая указывает на экземпляр реализации class
(то же понятие, что и Super class reference
, указывающее на subclass instance
). Таким образом, вы можете выполнить проверку instanceof
.
Например, например:
public interface MyInterface {
}
class ImplClass implements MyInterface {
public static void main(String[] args) {
MyInterface obj = new ImplClass();
System.out.println(obj instanceof ImplClass); // Will print true.
}
}
Ответ 4
- Прежде всего instanceof используется для сравнения того, имеет ли переменная Reference объекта, содержащая объект определенного типа, или нет.
Например:
public void getObj(Animal a){ // a is an Object Reference Variable of type Animal
if(a instanceof Dog){
}
}
- В случае interface
class
, который реализует, он может использоваться с instanceof
.
Например:
public interface Brush{
public void paint();
}
public class Strokes implements Brush{
public void paint(){
System.out.println("I am painting");
}
}
public class Test{
public static void main(String[] args){
Brush b = new Strokes();
if(b instanceof Strokes){
b.paint();
}
}
}
Ответ 5
hi Ниже приведено значение True для экземпляраOf:
• If S is an ordinary (nonarray) class, then:
• If T is a class type, then S must be the same class as T, or S must be a subclass of T;
• If T is an interface type, then S must implement interface T.
• If S is an interface type, then:
• If T is a class type, then T must be Object.
• If T is an interface type, then T must be the same interface as S or a superinterface of S.
• If S is a class representing the array type SC[], that is, an array of components of type SC, then:
• If T is a class type, then T must be Object.
• If T is an interface type, then T must be one of the interfaces implemented by arrays (JLS §4.10.3).
• If T is an array type TC[], that is, an array of components of type TC, then one of the following must be true:
- TC and SC are the same primitive type.
- TC and SC are reference types, and type SC can be cast to TC by these run-time rules
Перейдите по этой ссылке, чтобы получить четкое представление:
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof
Ответ 6
public class Programmers {
public static boolean hasReallife(Programmer programmer) {
return programmer instanceof Reallife; ══════════════════╗
} ║
║
} ║
▼
public class ReallifeProgrammer extends Programmer implements Reallife {
public ReallifeProgrammer() {
diseases.get("Obesity").heal();
diseases.get("Perfectionism").heal();
diseases.get("Agoraphobia").heal();
}
@Override
public void goOut() {
house.getPC().shutDown();
wife.argue();
}
@Override
public void doSports() {
goOut();
BigWideWorld.getGym("McFit").visit();
}
@Override
public void meetFriends() {
goOut();
BigWideWorld.searchFriend().meet();
}
}
Ответ 7
Я знаю, что это очень старый вопрос со многими хорошими ответами. Я просто хочу указать самый простой (по крайней мере, самый легкий для меня) способ понять этот оператор.
Если o instanceof t
возвращает true
, тогда
t castedObj = (t) o;
не будет бросать ClassCastException
, а castedObj
не будет null
.
Это важно/полезно, если вы хотите позже получить доступ к полям или методам из castedObj
- вы знаете, что, выполняя проверку instanceof
, у вас никогда не будет проблем позже.
Единственным недостатком является то, что это можно использовать для типов без дженериков.
Ответ 8
Оператор instanceof скажет вам, является ли первый аргумент объектом, который реализует второй аргумент. Не понимаю, почему это имеет значение, что вы не можете напрямую создавать интерфейс.
Integer num = 1;
if (num instanceof Number) {
System.out.println("An integer is a number!");
}
Это все, что вам нужно.