web-dev-qa-db-ja.com

instanceofがインターフェイスでどのように機能するか

instanceofを使用して、オブジェクトが特定のクラスの直接のインスタンスであるか、子孫のインスタンスであるかをテストできます。インターフェースをクラスのようにインスタンス化することはできませんが、instanceofもインターフェースで使用できます。誰でもinstanceofの仕組みを説明できますか?

43
developer

まず、特定の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テストに合格します

[〜#〜] edit [〜#〜]

そして出力

instanceof succeeded
instanceof succeeded

なかむら

このような匿名の内部クラスを使用して、インターフェイスのインスタンスを作成できます

Runnable runnable = new Runnable() {

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

そして、このようなinstanceof演算子を使用して、インスタンスがインターフェース型であることをテストします

System.out.println(runnable instanceof Runnable);

結果は「true」です

52
sunil

object instanceof object_interfacetrueを生成します。

16

instanceofに対してreferenceinstanceチェックを行い、特定の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.
    }
}
6
Rohit Jain

-まず、instanceofを使用して、オブジェクトを保持するオブジェクト参照変数が特定のタイプかどうかを比較します。

例:

public void getObj(Animal a){       // a is an Object Reference Variable of type Animal

    if(a instanceof Dog){


       }

}

-interfaceの場合、implementsできるclassinstanceofで使用されます。

例:

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

}
3

hi以下は、instanceOfに対してTrueを生成します。

•   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

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

}
2
BinaryJulian

これは非常に古い質問であり、多くの良い答えがあります。この演算子を理解する最も簡単な(少なくとも私にとっては最も簡単な)方法を指摘したいと思います。

_o instanceof t_がtrueを返す場合、t castedObj = (t) o;ClassCastExceptionをスローせず、castedObjnullになりません。

これは後でcastedObjからフィールドまたはメソッドにアクセスする場合に重要/有用です。instanceofチェックを行うことで、後で問題が発生することはありません。

唯一の欠点は、これがジェネリックのない型に使用できることです。

0
Jai