How to check if an Object is a Collection Type in Java?
通过使用Java反射,我们可以轻松知道对象是否为数组。 判断对象是否为集合(Set,List,Map,Vector ...)的最简单方法是什么?
1 2 3 4 5 | if (x instanceof Collection< ? >){ } if (x instanceof Map<?,?>){ } |
更新:这里有两种可能的情况:
您正在确定对象是否为集合;
您正在确定一个类是否是一个集合。
解决方案略有不同,但原理相同。您还需要定义什么才构成"集合"。实现
解决方案1:
1 2 3 | public static boolean isCollection(Object ob) { return ob instanceof Collection || ob instanceof Map; } |
解决方案2:
1 2 3 | public static boolean isClassCollection(Class c) { return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c); } |
(1)也可以根据(2)来实现:
1 2 3 | public static boolean isCollection(Object ob) { return ob != null && isClassCollection(ob.getClass()); } |
我认为这两种方法的效率都不会大大不同。
既然您在问题中提到反思,
1 2 3 | boolean isArray = myArray.getClass().isArray(); boolean isCollection = Collection.class.isAssignableFrom(myList.getClass()); boolean isMap = Map.class.isAssignableFrom(myMap.getClass()); |
Java方便地使用
1 2 3 4 5 6 7 | 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 } |
这里应该提到一件事:在这种类型的结构中,以正确的顺序进行检查很重要。您会发现,如果您在上面的代码段中交换了检查的顺序,代码仍然可以编译,但是将不再起作用。那是下面的代码不起作用:
1 2 3 4 5 6 7 8 | // 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 } |
问题是
测试对象是否实现
您是否考虑过使用
就像说
1 2 |
尽管不是那种纯粹的OOP风格,但是它被广泛用于所谓的"类型升级"。