如何检查对象是否为Java中的集合类型?

2020/12/31 23:11 · java ·  · 0评论

通过使用Java反射,我们可以轻松知道对象是否为数组。判断对象是否为集合(Set,List,Map,Vector ...)的最简单方法是什么?

if (x instanceof Collection<?>){
}

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

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

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

我认为这两种方法的效率都不会大大不同。

既然您在问题中提到反思,

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)来测试给定对象是否为给定类型。

 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
 }

问题是aList<?>是-a Collection<?>,因此它将通过第一个测试,并且else意味着它将永远不会到达第二个测试。您必须测试从最具体到最一般的类型

测试对象是否实现java.util.Collectionjava.util.MapMap因为它不是的子接口,所以必须单独进行测试Collection。)

您考虑过使用instanceof吗?就像说

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

尽管不是那种纯粹的OOP风格,但是它被广泛用于所谓的“类型升级”。

本文地址:http://java.askforanswer.com/ruhejianchaduixiangshifouweijavazhongdejiheleixing.html
文章标签:
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!