如何检查对象是否是Java中的集合类型?
通过使用java反射,我们可以很容易地知道一个对象是否是一个数组。告诉对象是否为集合(Set,List,Map,Vector ...)的最简单方法是什么?如何检查对象是否是Java中的集合类型?
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
您是否想过使用instanceof
? 一样,说
if(myObject instanceof Collection) {
Collection myCollection = (Collection) myObject;
虽然不是纯OOP的风格,然而主要用于所谓的“升级型”。
不要在新代码中使用原始类型。 – polygenelubricants 2010-04-16 09:03:16
有时候,像我这样的老开发人员倾向于依赖pre-java1.5符号来处理像这样的不可编译的例子,特别是当泛型符号没有添加任何值时。 – Riduidel 2010-04-16 09:27:29
增加的值是您明确声明类型未知。无法在1.5之前的版本中传达这些信息。 – Max 2016-01-15 11:28:14
测试对象是否实现了java.util.Collection
或java.util.Map
。 (Map
有,因为它不是的Collection
子接口单独被测试。)
更新:这里有两种可能的情况:
您确定对象是采集;
您正在确定某个类是否为集合。
解决方案略有不同,但原理相同。您还需要定义完全构成“集合”的内容。实现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());
}
我不认为任何一种方法的效率都会大大不同。
为什么不使用“instanceof”? – Thilo 2010-04-16 08:46:24
这个任务可以在没有“instanceof”的情况下被清除。 – 2010-04-16 08:49:11
@cletus:很好的决定。谢谢。 – 2010-04-16 08:49:42
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<?>
是-A Collection<?>
,所以它会通过第一次测试,并else
意味着它永远不会达到第二次测试。 您必须从最具体到最普通的类型进行测试。
地图不延伸收藏。 – Thilo 2010-04-16 09:04:37
@Thilo:brainfarted;修改为'List'。重要的观点依然存在。 – polygenelubricants 2010-04-16 09:10:10
既然你在你的问题中提到了反思,
boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
这里最好的答案IMO – Madbreaks 2016-07-27 17:40:00
请注意那里的'?'。您无法获取已擦除的组件类型。如果您需要知道集合中可以包含哪些对象,则需要查看这些元素本身。 – Thilo 2016-01-12 01:20:21
如何在没有元素的情况下找出集合中存在哪些对象? – MichalH 2016-07-04 19:05:23