2010-04-16 21 views

Respuesta

76
if (x instanceof Collection<?>){ 
} 

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

Tenga en cuenta el '?' Allí. No puede acceder al tipo de componente borrado. Si necesita saber qué tipo de objetos podrían estar en la colección, necesita ver los elementos por sí mismos. – Thilo

+1

¿Cómo saber qué tipo de objetos hay en la colección cuando no hay elementos? – MichalH

1

¿Has pensado en usar instanceof? como, por ejemplo

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

Aunque no es que el estilo de programación orientada a objetos puro, sin embargo, se utiliza en gran medida para los llamados "Tipo de escalada".

+5

No use tipos sin procesar en el nuevo código. – polygenelubricants

+1

Los viejos desarrolladores como yo en algún momento tienden a confiar en la notación pre-java1.5 para ejemplos no compilables como este, especialmente cuando la notación de genéricos no agrega ningún valor. – Riduidel

+0

El valor agregado es que está declarando explícitamente que no se conoce el tipo. No hay forma de transmitir esta información en notación anterior a la 1.5. – Max

3

Pruebe si el objeto implementa java.util.Collection o . (Map tiene que ser probado por separado, ya que no es un sub-interfaz de Collection.)

37

Actualización: hay dos posibles escenarios: aquí

  1. está determinando si un objeto es una colección;

  2. Usted está determinando si una clase es una colección.

Las soluciones son ligeramente diferentes, pero los principios son los mismos. También necesita definir qué constituye exactamente una "colección". La implementación de Collection o Map cubrirá las Colecciones de Java.

Solución 1:

public static boolean isCollection(Object ob) { 
    return ob instanceof Collection || ob instanceof Map; 
} 

Solución 2:

public static boolean isClassCollection(Class c) { 
    return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c); 
} 

(1) también se puede implementar en términos de (2):

public static boolean isCollection(Object ob) { 
    return ob != null && isClassCollection(ob.getClass()); 
} 

no creo la eficiencia de cualquiera de los métodos será muy diferente de la otra.

+0

¿Por qué no utilizar "instanceof"? – Thilo

+0

Debido a que la tarea puede ser sovled sin "instanceof" –

+0

@cletus: buena decisión. Gracias. –

4

Java tiene convenientemente el operador instanceof (JLS 15.20.2) para probar si un objeto determinado es de un tipo determinado.

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 
} 

Una cosa hay que mencionar aquí: que es importante en este tipo de construcciones para comprobar en el orden correcto. Verá que si cambió el orden del cheque en el fragmento de arriba, el código aún se compilará, pero ya no funcionará. Ese es el siguiente código no funciona:

// 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 
} 

El problema es que una List<?> is-a Collection<?>, por lo que se pasa a la primera prueba, y el else significa que nunca va a llegar a la segunda prueba. Tiene que probar desde el más específico hasta el tipo más general.

+1

El mapa no extiende la colección. – Thilo

+2

@Thilo: brainfarted; modificado a 'List'. Punto importante sigue en pie. – polygenelubricants

12

Como mencionó la reflexión en su pregunta;

boolean isArray = myArray.getClass().isArray(); 
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass()); 
boolean isMap = Map.class.isAssignableFrom(myMap.getClass()); 
+1

La mejor respuesta aquí IMO – Madbreaks

Cuestiones relacionadas