2012-12-07 52 views
3

instanceof如何工作?當我有一個擴展和實現彼此的對象的層次結構時,是否通過這兩條線有效地工作?Java instanceof implements/extends

例如,我想知道我的對象是否是ListArrayListCollection的實例?

我觀察這棵樹,http://docs.oracle.com/javase/6/docs/api/java/util/package-tree.html

他們似乎Object下的所有下跌ofcourse,但我需要什麼,我覺得是AbstractCollection甚至不能正常Collection,因爲這似乎是在層次結構中最高的。

當我檢查一個對象時,我僅僅檢查對象Collection來覆蓋所有這3個類嗎?

回答

7

當我檢查一個對象只包含Collection以涵蓋所有這3個類時,我會好嗎?

是的,instanceof Collection將對Collection接口的所有實現(直接或間接)返回true。

在極少數情況下,你不需要這個,你必須使用反射。例如,Class#getDeclaredClasses會給你一個由班級直接擴展/實現的所有類和接口的列表。

一旦你知道的東西是一個集合,你可以投它可以訪問它的方法(如iterator):

if (myObject instanceof Collection){ 
     Collection<?> c = (Collection<?>) myObject; 
     for (Object o: c){ 
     // do something with every element in the collection 
     } 
    } 
+0

確定後返回true,我可以以某種方式檢索第一個項目,他們有我可以使用的通用方法,因爲他們是'instanceof集合',我應該能夠使用'iterator.next()' – Jaanus

+0

哦,你想迭代所有*實現Collection的類?沒有真正的方法來做到這一點。你需要什麼? – Thilo

+0

或者你想要類X繼承的類和接口的「樹」?你可以通過反射來完成:Class#getClasses http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29 – Thilo

1
if(obj instanceof Collection) 

如果對象是任何類型的集合,則返回true。因此,它將返回true爲您的3例,但它也將返回true其他情況下,如HashMap

0

當我檢查一個對象只對Collection收集所有這3個類時,我會好嗎?

並不總是如此。

有可能是對象is-a a Collection但是ArrayList

例如:

ArrayList anArrList = new ArrayList(); 
HashMap ahashMap = new HashMap(); 

anArrList instanceof Collection // true 
ahashMap instanceof Collection // true 

,但兩者都是在不同的層次結構。

1

instanceof運營商將返回true如果檢查對象是類或子類給定的類或它(或其祖先之一)實現給定的接口。