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

时间:2010-04-16 08:40:06

标签: java

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

6 个答案:

答案 0 :(得分:90)

if (x instanceof Collection<?>){
}

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

答案 1 :(得分:42)

更新:此处有两种可能的情况:

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

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

  3. 解决方案略有不同,但原则是相同的。您还需要定义“集合”的确切构成。实现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());
    }
    

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

答案 2 :(得分:16)

因为你在你的问题中提到了反思;

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

答案 3 :(得分: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
 }

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

 // 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<?>,所以它会通过第一个测试,而else意味着它永远不会达到第二个测试。 您必须从最具体到最常见的类型进行测试

答案 4 :(得分:3)

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

答案 5 :(得分:1)

您是否考虑过使用instanceof? 比如说,

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

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