Al usar la reflexión de java, podemos saber fácilmente si un objeto es una matriz. ¿Cuál es la forma más fácil de saber si un objeto es una colección (Conjunto, Lista, Mapa, Vector ...)?¿Cómo comprobar si un objeto es un tipo de colección en Java?
Respuesta
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
¿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".
No use tipos sin procesar en el nuevo código. – polygenelubricants
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
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
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
.)
Actualización: hay dos posibles escenarios: aquí
está determinando si un objeto es una colección;
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.
¿Por qué no utilizar "instanceof"? – Thilo
Debido a que la tarea puede ser sovled sin "instanceof" –
@cletus: buena decisión. Gracias. –
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.
El mapa no extiende la colección. – Thilo
@Thilo: brainfarted; modificado a 'List'. Punto importante sigue en pie. – polygenelubricants
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());
La mejor respuesta aquí IMO – Madbreaks
- 1. Java: cómo comprobar si un campo es del tipo java.util.Collection
- 2. ¿Cómo determinar si un tipo es un tipo de colección?
- 3. Comprobar si un objeto es NSInteger
- 4. Cómo comprobar si un objeto es serializable en C#
- 5. ¿Cómo comprobar si un tipo es un typedef int
- 6. KVO - ¿Cómo comprobar si un objeto es un observador?
- 7. Compruebe si un objeto es una colección genérica
- 8. ¿Cómo comprobar si un tipo es una cadena en C#?
- 9. ¿Cómo comprobar si un objeto es iterable en Ruby?
- 10. Cómo comprobar si un objeto es una matriz de un cierto tipo
- 11. ¿Cómo comprobar si un objeto es iterable en Python?
- 12. ¿Cómo comprobar si un objeto es cadena o matriz de cadenas en java?
- 13. ¿Cómo comprobar si un objeto es un objeto generador en python?
- 14. mejor manera de probar si un tipo es una colección
- 15. ¿Cómo comprobar si un objeto no es una matriz?
- 16. ¿Cómo comprobar si el objeto es un elemento DOM?
- 17. ¿Cómo verificar si un objeto es convertible a otro tipo?
- 18. ¿Cómo comprobar si un doble es nulo?
- 19. ¿Cómo puedo comprobar si existe un objeto en C++
- 20. Compruebe si un objeto es un delegado
- 21. iPhone cómo comprobar el tipo de un objeto?
- 22. Comprobar si un doble es infinita en Java
- 23. ¿Cómo verificar si un objeto no es de un tipo particular?
- 24. ¿Cómo comprobar si un puntero es válido?
- 25. manera correcta para comprobar si un tipo es anulable
- 26. Cómo comprobar si un hilo mantiene un bloqueo en un objeto en C#?
- 27. ¿Cómo comprobar si el objeto JSON está vacío en Java?
- 28. ¿Cómo comprobar si un parámetro de plantilla es un tipo de iterador o no?
- 29. ¿Cómo comprobar si un vector es un subconjunto de otro?
- 30. ¿Cómo comprobar si un tipo T de un método genérico es IEnumerable <> y repetirlo?
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
¿Cómo saber qué tipo de objetos hay en la colección cuando no hay elementos? – MichalH