【发布时间】:2011-06-14 21:05:59
【问题描述】:
我有一个 java 方法,它应该检查 ArrayList 并检查它是否包含给定类的实例。我需要将要检查的类的类型作为参数传递给方法,如果 List 包含给定类型的对象,则返回它。
这可以实现吗?
【问题讨论】:
标签: java arraylist instanceof
我有一个 java 方法,它应该检查 ArrayList 并检查它是否包含给定类的实例。我需要将要检查的类的类型作为参数传递给方法,如果 List 包含给定类型的对象,则返回它。
这可以实现吗?
【问题讨论】:
标签: java arraylist instanceof
public static <T> T find(Collection<?> arrayList, Class<T> clazz)
{
for(Object o : arrayList)
{
if (o != null && o.getClass() == clazz)
{
return clazz.cast(o);
}
}
return null;
}
然后打电话
String match = find(myArrayList, String.class);
【讨论】:
Class.isAssignableFrom来处理子类,并且该方法应该使用Collection而不是ArrayList(即编程到接口)。还可以考虑使用 Java 推荐的使方法名称以小写开头的编码标准。
Class.isInstance
public static <T> T getFirstElementOfTypeIn( List<?> list, Class<T> clazz )
{
for ( Object o : list )
{
if ( clazz.isAssignableFrom( o.getClass() ) )
{
return clazz.cast( o );
}
}
return null;
}
【讨论】:
clazz.isAssignableFrom( o.getClass() )可以写成clazz.isInstance( o )
如果您使用的是 Java 8,您可以这样做:
public <T> Optional<T> getInstanceOf(Class<T> clazz, Collection<?> collection) {
return (Optional<T>) collection.stream()
.filter(e -> clazz.isInstance(e.getClass()))
.findFirst();
}
如果您以前从未使用过Optional,请查看它的文档。实际上这比returning null 更好。
【讨论】:
您可以遍历列表并测试每个元素
Class<?> zz = String.class;
for (Object obj : list) {
if (zz.isInstance(obj)) {
System.out.println("Yes it is a string");
}
}
请注意,isInstance 也捕获子类。否则请参阅 Bela 的回答。
【讨论】:
检查列表中的项目实例之一
if (object instanceof ArrayList<?>) {
if (((ArrayList<?>) object).get(0) instanceof ClassA) {
classAList= (ArrayList<ClassA>) object;
} else if (((ArrayList<?>) object).get(0) instanceof ClassB) {
classBList= (ArrayList<classB>) object;
} else if (((ArrayList<?>) object).get(0) instanceof ClassC) {
classCList= (ArrayList<ClassC>) object;
}
}
【讨论】: