如何检查对象是Java中的集合types?

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

if (x instanceof Collection<?>){ } if (x instanceof Map<?,?>){ } 

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

  1. 你正在确定一个对象是否是一个集合;

  2. 你正在确定一个class是否是一个集合。

解决scheme略有不同,但原则是相同的。 你还需要确定究竟是什么构成一个“集合”。 实现CollectionMap将覆盖Java集合。

解决scheme1:

 public static boolean isCollection(Object ob) { return ob instanceof Collection || ob instanceof Map; } 

解决scheme2:

 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()); } 

我不认为任何一种方法的效率都会大大不同。

既然你提到了你的问题的反思,

 boolean isArray = myArray.getClass().isArray(); boolean isCollection = Collection.class.isAssignableFrom(myList.getClass()); boolean isMap = Map.class.isAssignableFrom(myMap.getClass()); 

Java方便地使用instanceof运算符( JLS 15.20.2 )来testing给定的对象是否是给定的types。

  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 } 

有一件事应该在这里提到: 在这些types的结构中检查正确的顺序是很重要的 。 你会发现,如果你已经在上面的代码中交换了检查的顺序,代码仍然会被编译,但是它将不再起作用 。 那是下面的代码不起作用:

  // 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<?> ,所以它会通过第一个testing, else意味着它永远不会到达第二个testing。 你必须从最具体到最一般的types进行testing

testing对象是否实现java.util.Collectionjava.util.Map 。 ( Map必须单独testing,因为它不是Collection的子接口。)

你有没有想过使用instanceof ? 比如说

 if(myObject instanceof Collection) { Collection myCollection = (Collection) myObject; 

虽然不是那种纯粹的OOP风格,但它主要用于所谓的“types升级”。