如何检查Object是否是Java中的集合类型?

Saw*_*yer 62 java

通过使用java反射,我们可以很容易地知道对象是否是一个数组.什么是判断对象是否是集合的最简单方法(Set,List,Map,Vector ...)?

Thi*_*ilo 96

if (x instanceof Collection<?>){
}

if (x instanceof Map<?,?>){
}
Run Code Online (Sandbox Code Playgroud)

  • 注意那里的`?`.您无法访问已擦除的组件类型.如果您需要知道集合中可能包含哪些对象,则需要查看元素本身. (3认同)
  • 当集合中没有元素时,如何找出集合中存在哪些类型的对象? (3认同)

cle*_*tus 46

更新:这里有两种可能的情况:

  1. 您正在确定对象是否是集合;

  2. 您正在确定某个类是否为集合.

解决方案略有不同,但原则是相同的.您还需要定义"集合"的确切构成.实现CollectionMap将覆盖Java集合.

解决方案1:

public static boolean isCollection(Object ob) {
  return ob instanceof Collection || ob instanceof Map;
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

public static boolean isClassCollection(Class c) {
  return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);
}
Run Code Online (Sandbox Code Playgroud)

(1)也可以用(2)来实现:

public static boolean isCollection(Object ob) {
  return ob != null && isClassCollection(ob.getClass());
}
Run Code Online (Sandbox Code Playgroud)

我不认为任何一种方法的效率都会与另一种方法大不相同.


Fou*_*pie 17

既然你在问题中提到了反思;

boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 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
 }
Run Code Online (Sandbox Code Playgroud)

这里应该提到一件事:在这些类型的结构中检查正确的顺序是很重要的.您会发现,如果您在上面的代码段中交换了支票的顺序,代码仍然会编译,但它将不再有效.这是以下代码不起作用:

 // 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
 }
Run Code Online (Sandbox Code Playgroud)

问题是a List<?>是a Collection<?>,所以它将通过第一次测试,并且else意味着它永远不会达到第二次测试.您必须从最具体到最一般的类型进行测试.

  • @Thilo:脑力激荡; 修改为`List`.重点仍然存在. (2认同)