Как instanceof будет работать на интерфейсе

instanceof может использоваться для проверки, является ли объект прямым или нисходящим экземпляром данного класса. instanceof также может быть использован с интерфейсами, даже если интерфейсы не могут быть созданы, как классы. Может ли кто-нибудь объяснить, как instanceof работает?

8 ответов


прежде всего, мы можем хранить 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 {

}

ie, любой экземпляр среды выполнения, реализующий определенный интерфейс, передаст instanceof тест

редактировать

и вывода

instanceof succeeded
instanceof succeeded

@RohitJain

вы можете создавать экземпляры интерфейсов с помощью анонимных внутренних классов такой

Runnable runnable = new Runnable() {

    public void run() {
        System.out.println("inside run");
    }
};

и вы испытываете экземпляр имеет тип interface, используя instanceof оператор такой

System.out.println(runnable instanceof Runnable);

и результат "true"


object instanceof object_interface даст true.


ты 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.
    }
}

- прежде всего instanceof используется для сравнения, является ли объект ссылочной переменной, содержащей объект определенного типа или нет.

например:

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();
       }
  }

}

hi приведенное ниже даст True для instanceOf:

•   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


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();
    }

}

Я знаю, что это очень-очень старый вопрос со множеством ответов. Я просто хочу указать самый простой (по крайней мере, для меня) способ понять этого оператора.

если o instanceof t возвращает true, тогда t castedObj = (t) o; не бросят ClassCastException и castedObj не будет null.

это важно/полезно, если вы хотите получить доступ к полям или методам из castedObj позже - вы знаете, что делать instanceof проверьте, у вас никогда не будет проблем позже.

единственным недостатком является то, что это можно использовать для типов без дженериков.


оператор instanceof сообщит вам, является ли первый аргумент объектом, реализующим второй аргумент. Не понимаю, почему это имеет значение, что вы не можете непосредственно создать экземпляр интерфейса.

Integer num = 1;
if (num instanceof Number) {
  System.out.println("An integer is a number!");
}

Это все, что вам нужно.