Как 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 {

}

т. е. любой экземпляр времени выполнения, который реализует определенный интерфейс, пройдет 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);

и результат "правда"

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

}

- Прежде всего 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();
       }
  }

}

Привет. Ниже приведен 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

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

Если 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!");
}

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

Другие вопросы по тегам