5

instanceof 究竟是如何工作的?当我有一个相互扩展和实现的对象层次结构时,作为某物的实例是否通过这两条线起作用?

例如,我想知道我的对象是否是Listor ArrayListor的实例Collection

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

他们似乎都属于Object当然,但我需要的是,我认为是AbstractCollection甚至是正常Collection的,因为这似乎是最高等级的。

当我只检查一个对象Collection以涵盖所有这 3 个类时,我会没事吗?

4

4 回答 4

10

当我仅针对 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
      }
  }
于 2012-12-07T11:56:00.420 回答
1
if(obj instanceof Collection) 

如果对象是任何类型的集合,将返回 true。因此,对于您的 3 种情况,它将返回 true,但是对于 HashMap 等其他情况,它也会返回 true

于 2012-12-07T11:55:44.930 回答
1

当我仅针对 Collection 检查对象以涵盖所有这 3 个类时,我会好吗?

不总是。

is-a一个对象a Collectionbut是可能的ArrayList

例如:

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

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

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

于 2012-12-07T11:55:56.053 回答
1

instanceoftrue如果检查的对象是给定类的类或子类,或者它(或其祖先之一)实现给定接口,则运算符将返回。

于 2012-12-07T11:58:13.743 回答