2010-04-16 424 views

回答

76
if (x instanceof Collection<?>){ 
} 

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

请注意那里的'?'。您无法获取已擦除的组件类型。如果您需要知道集合中可以包含哪些对象,则需要查看这些元素本身。 – Thilo 2016-01-12 01:20:21

+1

如何在没有元素的情况下找出集合中存在哪些对象? – MichalH 2016-07-04 19:05:23

1

您是否想过使用instanceof? 一样,说

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

虽然不是纯OOP的风格,然而主要用于所谓的“升级型”。

+5

不要在新代码中使用原始类型。 – polygenelubricants 2010-04-16 09:03:16

+1

有时候,像我这样的老开发人员倾向于依赖pre-java1.5符号来处理像这样的不可编译的例子,特别是当泛型符号没有添加任何值时。 – Riduidel 2010-04-16 09:27:29

+0

增加的值是您明确声明类型未知。无法在1.5之前的版本中传达这些信息。 – Max 2016-01-15 11:28:14

3

测试对象是否实现了java.util.Collectionjava.util.Map。 (Map有,因为它不是的Collection子接口单独被测试。)

37

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

  1. 您确定对象是采集;

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

解决方案略有不同,但原理相同。您还需要定义完全构成“集合”的内容。实现CollectionMap将覆盖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()); 
} 

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

+0

为什么不使用“instanceof”? – Thilo 2010-04-16 08:46:24

+0

这个任务可以在没有“instanceof”的情况下被清除。 – 2010-04-16 08:49:11

+0

@cletus:很好的决定。谢谢。 – 2010-04-16 08:49:42

4

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意味着它永远不会达到第二次测试。 您必须从最具体到最普通的类型进行测试。

+1

地图不延伸收藏。 – Thilo 2010-04-16 09:04:37

+2

@Thilo:brainfarted;修改为'List'。重要的观点依然存在。 – polygenelubricants 2010-04-16 09:10:10

12

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

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

这里最好的答案IMO – Madbreaks 2016-07-27 17:40:00

相关问题