¿Componente que verifica si los objetos de un java.lang.reflect.Type se pueden convertir a otro?

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 Classes, y debe tener en cuenta los genéricos, es decir, un List<Integer> no debe ser calcinable a un List<Object>.

Saludos, Jochen

preguntado el 03 de mayo de 12 a las 14:05

3 Respuestas

Respondido el 19 de junio de 18 a las 13:06

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 a B si uno de ellos es asignable al otro. - Luis Wassermann

Asegúrate de que A := List<Integer> y B := Collection<? extends Number>. A es asignable a B, sin embargo, un elenco de B a una A 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 dactilares false 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> a List<X> y el elenco fallará (tal vez es un HashSet<X>) o tendrá éxito, porque el valor era un List<X>. Todo lo que el elenco realmente verifica es que el valor es un List (tipo crudo), pero si es un List entonces no hay manera de que sea un List<Y>, con Y != 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

Guayaba TypeToken está diseñado exactamente para este problema, entre otros. Está destinado a ser un reemplazo para Class Eso es genérico. (Divulgación: contribuyo a Guayaba).

contestado el 03 de mayo de 12 a las 16:05

Después de ver ambos, creo que me gusta un poco más el enfoque de Guava. Puramente subjetivo, por supuesto. - Jochen

Deberías decidir por tu cuenta, así que echa un vistazo a la respuesta de Guillaume también. - Jochen

if (clazz.isAssignableFrom(otherClazz))
{
    return true; 
}

contestado el 03 de mayo de 12 a las 14:05

Esto solo funciona para Class objetos, no para Type, y no tiene en cuenta los genéricos. - Jochen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.