instanceof如何正常工作?当我有一个扩展并实现彼此的对象层次结构时,某些事物的实例是否可以通过这两条线工作?
例如,我想知道我的对象是List
还是ArrayList
还是Collection
的实例?
我检查了这棵树,http://docs.oracle.com/javase/6/docs/api/java/util/package-tree.html
而且他们似乎都落在了Object
之下,但我认为我需要的是AbstractCollection
甚至是正常的Collection
,因为这似乎是层次结构中最高的。 / p>
当我仅针对Collection
检查一个对象以覆盖所有这三个类时,我会没事吗?
答案 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-a
和Collection
但ArrayList
。
例如:
ArrayList anArrList = new ArrayList();
HashMap ahashMap = new HashMap();
anArrList instanceof Collection // true
ahashMap instanceof Collection // true
但两者都处于不同的层次结构中。