instanceof的是與非


java中instanceof關鍵字對於final、非final類、泛型、Object、interface,在編譯時的要求不同。

A、其中泛型實例可以與任何接口和類執行instanceof判斷(t instanceof User / t instanceof list);

B、interface實例可與任何對象(除final對象)執行instanceof判斷(list instanceof User / list instanceof Runnable);

C、Object實例可與任何對象執行instanceof判斷(obj instanceof User / obj instanceof List);

D、final與非final實例

D.1 同,對於類的instanceof判斷,都必須要求是父類; 

D.2 異,非final類可以instanceof非實現接口,但是final類不可以;

* 根本原因在於final類沒有子類,所以其實例必定是類自身,所以其實現接口和父類都是很確定的。

* 但是,非final類可以有子類,且只有一個子類。所以在對於類的instanceof判斷上也是確定的,其中子類可以實現非final類沒有的接口,所以編譯器也就寬容的放行了。

( 一開始以為與泛型有關,后來覺得可能與動態代理有關,最終驗證得與類是否可以有子類有關)

public class InstanceofTest {

    public void finalClassTest(){
        String str = "";//final Object
        
        //父類
        if(str instanceof Object){
            //
        }

        //非父類
//        Incompatible conditional operand types String and LinkedList
//        if(str instanceof LinkedList){  }

        //實現接口
        if(str instanceof Serializable ||
                str instanceof Comparable ||
                str instanceof CharSequence){
        //
        }
        
        //非實現接口
        //編譯器語法不通過
        //Incompatible conditional operand types String and Readable
//        if(str instanceof Readable){}
        
    }
    
    public  void unFinalClassTest(){
        //非final對象
        ArrayList<Object> array = new ArrayList<Object>();
        
        //非實現接口
        if(array instanceof Comparable){
            //
        }
        
        //非父類
        //編譯器語法不通過
        //Incompatible conditional operand types ArrayList<Object> and String
//        if(array instanceof LinkedList){}
        
    }
    
    interface Some{}
    class Dummy{ }
    class DummyChild extends Dummy implements Some{ }
    public  void unFinalClassTest2(){
        //非final對象
        Dummy dummy = new DummyChild();
        
        //非父類實現接口,卻是子類的實現接口
        if(dummy instanceof Some){
            //
        }
    }

    public <T>  void genericityClassTest(T genericityObj){
        
        if(genericityObj instanceof Comparable){ }
        
        if(genericityObj instanceof LinkedList){ }
    }
}

 

    public void testInterfaceOrObjInstanceof(){
        List<?> list = new ArrayList<String>();
        Object obj = new Thread();

        //接口與其它接口
        if(list instanceof Runnable){ }
        //接口與非final對象
        if(list instanceof FileInputStream){ }
        //接口與final對象
        //Incompatible conditional operand types List<capture#3-of ?> and Math
//        if(list instanceof Math){ }

        //obj與任意接口
        if(obj instanceof List){ }
        //obj與final對象
        if(obj instanceof Math){ }
        //obj與非final對象
        if(obj instanceof Float){ }
    }

 

<* 原創,轉載請注明>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM