2011-06-14 11 views
6

Tengo un método java que debe verificar a través de una ArrayList y comprobar si contiene una instancia de una clase determinada. Necesito pasar el método, el tipo de clase a verificar como parámetro, y si la Lista contiene un objeto del tipo dado, luego devolverlo.Comprobar ArrayList por ejemplo del objeto

¿Se puede lograr esto?

Respuesta

17
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;  
} 

y llame

String match = find(myArrayList, String.class); 
+3

+1 Para evitar el reparto sin marcar puede usar 'clazz.cast (o)'. – Howard

+3

Debe usar 'Class.isAssignableFrom' para manejar subclases, también el método debe tomar' Collection' en lugar de 'ArrayList' (es decir, programa en la interfaz). También considere usar el estándar de codificación recomendado de Java para hacer que los nombres de los métodos comiencen con minúsculas. –

+0

Gracias, esta respuesta funciona mejor para mi problema. – Danny

0

Usted puede iterador sobre su lista y probar cada elemento

Class<?> zz = String.class; 
for (Object obj : list) { 
    if (zz.isInstance(obj)) { 
     System.out.println("Yes it is a string"); 
    } 
} 

Tenga en cuenta que también capta isInstance subclases. De lo contrario, ver la respuesta de Bela.

+0

Esto ha sido votado, pero parece ser la mejor solución en la que no le preocupan las subclases de la clase o subclase que está revisando; como en mi caso, y como explica la publicación. Entonces, ¿por qué el voto hacia abajo? Si no se puede dar una buena explicación, voy a votar. –

4
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; 
} 
+0

' clazz.isAssignableFrom (o.getClass()) 'se puede escribir como' clazz.isInstance (o) ' – user102008

1

Si está utilizando Java 8 que puede hacer:

public <T> Optional<T> getInstanceOf(Class<T> clazz, Collection<?> collection) { 
    return (Optional<T>) collection.stream() 
      .filter(e -> clazz.isInstance(e.getClass())) 
      .findFirst(); 
} 

Consulte la documentación de Optional si nunca utilizado antes. En realidad, esta es una mejor práctica que returning null.

Cuestiones relacionadas