0

重複の可能性:
instanceof - 互換性のない条件付きオペランドの型

私は、Java の "instance of" 演算子をテストして、頭を整理しています。参照がクラスのインスタンスであるかどうかを確認するためにキーワードが使用されていることがわかります。

しかし、参照を使用してクラスと IS-A 関係を持たないクラスと比較すると、コンパイル時にエラーが発生します。

次のコードを参照してください。

package instanceofdemo;
public class Sample_1 {

    public static void main(String a[]){
        A iface = new Subclass();

        ///HERE INTERFACE OBJECT IS DOWNCASTED TO SUBCLASS
        if(iface instanceof  SuperClass){
            System.out.println("iface instanceof  SuperClass");
        }

        ///HERE INTERFACE OBJECT IS DOWNCASTED TO SUBCLASS
        if(iface instanceof  Subclass){
            System.out.println("iface instanceof  Subclass");
        }

        if(iface instanceof  A){
            System.out.println("iface instanceof  A");
        }


        Subclass sub = new Subclass();

        //SO INSTANCE OF ONLY WORKS WITH IS-A RELATION SHIP IN BI-DIRECTIONAL WAY
        //IT WILL GIVE COMPILE TIME ERROR, IF YOU TRY TO USE INSTANCE-OF WITH NON-RELATED CLASS
        if(sub instanceof  Independent){

        }

    }

}

interface  A{

}


class SuperClass implements A {

}



class Subclass extends  SuperClass{

}

class Independent{

}

上記のコード: if(iface instance of Independent)bcoz の行でコンパイル エラーが発生した場合 iface は Independent と「IS-A」関係にありません。

次に、キーワードの insatance の正確な使用法は何ですか? 「IS-A」関係でのみ使用される場合... if条件がfalseになる変更はどこにありますか??

4

1 に答える 1

3

これは機能であって、バグではありません。instanceofコンパイラは、基本的に満たされることが不可能な状況で演算子を使用することを防ぎます。たとえば、次のようになります。

String s = "abc";
if(s instanceof Integer) {
}

s instanceof Integer決して真実ではありません。ただし、チェックはコンパイル時に実行されるため、次のようにコンパイルされます。

Object s = "abc";
if(s instanceof Integer) {
}
于 2012-05-17T07:52:24.543 に答える