¿Componente que verifica si los objetos de un java.lang.reflect.Type se pueden convertir a otro?
Frecuentes
Visto 369 veces
0
Java expone información de tipo genérico, por ejemplo, para tipos de campo en tiempo de ejecución a través de la interfaz java.lang.reflect.Type
y sus subinterfaces (ParameterizedType, WildcardType).
¿Alguien sabe dónde puedo encontrar un componente que pueda determinar si los objetos de un tipo se pueden convertir en otro tipo, por ejemplo, si un Set<Object>
puede ser lanzado a Set
o con una Comparator<User>
puede ser lanzado a Comparator<? extends Object>
?
La solución debería funcionar para la información de tipo representada por java.lang.reflect.Type
, No sólo Class
es, y debe tener en cuenta los genéricos, es decir, un List<Integer>
no debe ser calcinable a un List<Object>
.
Saludos, Jochen
3 Respuestas
4
JPuedes echar un vistazo a Apache Commons-idioma:
Respondido el 19 de junio de 18 a las 13:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java generics or haz tu propia pregunta.
Quiero señalar que el uso de TypeUtils.isAssignable(...) no le permite verificar si hay conversiones seguras. Por ejemplo, un elenco de Collection Listar es perfectamente seguro, pero Collection no es "asignable" a la lista . La pregunta original implica que isAssignable es suficiente, pero la palabra "cast" se usa en todo momento, así que pensé que valía la pena mencionarlo. - Ben Schulz
I pensar que puedes lanzar desde
A
aB
si uno de ellos es asignable al otro. - Luis WassermannAsegúrate de que
A := List<Integer>
yB := Collection<? extends Number>
.A
es asignable aB
, sin embargo, un elenco deB
a unaA
estaría sin marcar y, por lo tanto, inseguro. - Ben Schulz@BenSchulz corriendo
System.err.println(TypeUtils.isAssignable(Collection.class, List.class)); System.err.println(TypeUtils.isAssignable(List.class, Collection.class));
huellas dactilaresfalse
true
. Puedo enviar una lista a una colección de forma segura, pero no al revés. No entiendo cuál es el problema con eso. - Guillermo Polet@GuillaumePolet Puede emitir un valor de tipo
Collection<X>
aList<X>
y el elenco fallará (tal vez es unHashSet<X>
) o tendrá éxito, porque el valor era unList<X>
. Todo lo que el elenco realmente verifica es que el valor es unList
(tipo crudo), pero si es unList
entonces no hay manera de que sea unList<Y>
, conY != X
porque cualquier clase solo puede implementar una parametrización de cualquier interfaz dada (aquíCollection
). Eso significa que el lanzamiento es seguro (no hay contaminación del montón antes del lanzamiento => no hay contaminación del montón después). - Ben Schulz