通过使用java反射,我们可以很容易地知道对象是否是一个数组。告诉对象是否是一个集合(Set,List,Map,Vector ......)最简单的方法是什么?
答案 0 :(得分:90)
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
答案 1 :(得分:42)
更新:此处有两种可能的情况:
您正在确定对象是否为集合;
您正在确定某个班级是否为集合。
解决方案略有不同,但原则是相同的。您还需要定义“集合”的确切构成。实现Collection
或Map
将涵盖Java集合。
解决方案1:
public static boolean isCollection(Object ob) {
return ob instanceof Collection || ob instanceof Map;
}
解决方案2:
public static boolean isClassCollection(Class c) {
return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);
}
(1)也可以用(2):
来实现public static boolean isCollection(Object ob) {
return ob != null && isClassCollection(ob.getClass());
}
我不认为任何一种方法的效率都会与另一种方法的效率大不相同。
答案 2 :(得分:16)
因为你在你的问题中提到了反思;
boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
答案 3 :(得分:6)
Java方便地使用instanceof
运算符(JLS 15.20.2)来测试给定对象是否属于给定类型。
if (x instanceof List<?>) {
List<?> list = (List<?>) x;
// do something with list
} else if (x instanceof Collection<?>) {
Collection<?> col = (Collection<?>) x;
// do something with col
}
这里应该提到一件事:在这些类型的构造中,以正确的顺序检查非常重要。您会发现,如果您在上面的代码段中交换了支票的顺序,代码仍然会编译,但它将不再有效。这是以下代码不起作用:
// DOESN'T WORK! Wrong order!
if (x instanceof Collection<?>) {
Collection<?> col = (Collection<?>) x;
// do something with col
} else if (x instanceof List<?>) { // this will never be reached!
List<?> list = (List<?>) x;
// do something with list
}
问题是List<?>
是一个Collection<?>
,所以它会通过第一个测试,而else
意味着它永远不会达到第二个测试。 您必须从最具体到最常见的类型进行测试。
答案 4 :(得分:3)
测试对象是实现java.util.Collection
还是java.util.Map
。 (Map
必须单独测试,因为它不是Collection
的子接口。)
答案 5 :(得分:1)
您是否考虑过使用instanceof
?
比如说,
if(myObject instanceof Collection) {
Collection myCollection = (Collection) myObject;
虽然不是那种纯粹的OOP风格,但它主要用于所谓的“类型升级”。