如何检查对象是Java中的集合types?
通过使用javareflection,我们可以很容易地知道一个对象是否是一个数组。 什么是最简单的方法来判断一个对象是否是一个集合(Set,List,Map,Vector …)?
if (x instanceof Collection<?>){ } if (x instanceof Map<?,?>){ }
更新:这里有两种可能的情况:
-
你正在确定一个对象是否是一个集合;
-
你正在确定一个class是否是一个集合。
解决scheme略有不同,但原则是相同的。 你还需要确定究竟是什么构成一个“集合”。 实现Collection
或Map
将覆盖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.Collection
或java.util.Map
。 ( Map
必须单独testing,因为它不是Collection
的子接口。)
你有没有想过使用instanceof
? 比如说
if(myObject instanceof Collection) { Collection myCollection = (Collection) myObject;
虽然不是那种纯粹的OOP风格,但它主要用于所谓的“types升级”。