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){ } }
<* 原創,轉載請注明>
