Java instanceof implements / extends

时间:2012-12-07 11:53:39

标签: java instanceof

instanceof如何正常工作?当我有一个扩展并实现彼此的对象层次结构时,某些事物的实例是否可以通过这两条线工作?

例如,我想知道我的对象是List还是ArrayList还是Collection的实例?

我检查了这棵树,http://docs.oracle.com/javase/6/docs/api/java/util/package-tree.html

而且他们似乎都落在了Object之下,但我认为我需要的是AbstractCollection甚至是正常的Collection,因为这似乎是层次结构中最高的。 / p>

当我仅针对Collection检查一个对象以覆盖所有这三个类时,我会没事吗?

4 个答案:

答案 0 :(得分:9)

  

当我检查一个仅针对Collection的对象以涵盖所有这三个类时,我会没事吗?

是的,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
      }
  }

答案 1 :(得分:1)

if(obj instanceof Collection) 

如果对象是任何类型的集合,则返回true。因此,对于3个案例,它将返回true,但是对于其他案例,例如HashMap

,它也会返回true

答案 2 :(得分:1)

如果被检查对象是给定类的类或子类,或者它(或其祖先之一)实现给定接口,则

instanceof运算符将返回true

答案 3 :(得分:0)

  

当我检查一个仅针对Collection的对象以涵盖所有这三个类时,我会没事吗?

并非总是如此。

对象可能是is-aCollectionArrayList

例如:

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

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

但两者都处于不同的层次结构中。