通过使用java反射,我们可以很容易地知道对象是否是一个数组.什么是判断对象是否是集合的最简单方法(Set,List,Map,Vector ...)?
Thi*_*ilo 96
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
Run Code Online (Sandbox Code Playgroud)
cle*_*tus 46
更新:这里有两种可能的情况:
您正在确定对象是否是集合;
您正在确定某个类是否为集合.
解决方案略有不同,但原则是相同的.您还需要定义"集合"的确切构成.实现Collection或Map将覆盖Java集合.
解决方案1:
public static boolean isCollection(Object ob) {
return ob instanceof Collection || ob instanceof Map;
}
Run Code Online (Sandbox Code Playgroud)
解决方案2:
public static boolean isClassCollection(Class c) {
return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);
}
Run Code Online (Sandbox Code Playgroud)
(1)也可以用(2)来实现:
public static boolean isCollection(Object ob) {
return ob != null && isClassCollection(ob.getClass());
}
Run Code Online (Sandbox Code Playgroud)
我不认为任何一种方法的效率都会与另一种方法大不相同.
Fou*_*pie 17
既然你在问题中提到了反思;
boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
这里应该提到一件事:在这些类型的结构中检查正确的顺序是很重要的.您会发现,如果您在上面的代码段中交换了支票的顺序,代码仍然会编译,但它将不再有效.这是以下代码不起作用:
// 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
}
Run Code Online (Sandbox Code Playgroud)
问题是a List<?>是a Collection<?>,所以它将通过第一次测试,并且else意味着它永远不会达到第二次测试.您必须从最具体到最一般的类型进行测试.
| 归档时间: |
|
| 查看次数: |
83284 次 |
| 最近记录: |