¿Cómo puedo imprimir el tipo de un tipo Java genérico?toString() un tipo genérico en Java
Reflection? ¿Algún truco?
public class Foo<K> {
private K element;
@Override
public String toString() {
return "Type: " + K;
}
}
¿Cómo puedo imprimir el tipo de un tipo Java genérico?toString() un tipo genérico en Java
Reflection? ¿Algún truco?
public class Foo<K> {
private K element;
@Override
public String toString() {
return "Type: " + K;
}
}
element.getClass().getSimpleName()
probablemente haga lo que está esperando.
Debido a type erasure, no puede saber cuál fue el parámetro de tipo cuando se construyó la clase. Pero puede usar element.getClass()
para obtener el tipo de tiempo de ejecución del elemento (que probablemente sea una subclase del parámetro de tipo, aunque no está garantizado; podría haber habido un molde no seleccionado).
Sin embargo, hay algunos trucos que permiten el acceso a los parámetros de tipo. Hay algunos trucos que Guice can do. Además, si crea una subclase de Foo, así: Foo<Integer> foo = new Foo<Integer>(){};
(observe el {}
que lo convierte en una subclase anónima de Foo), entonces es posible obtener acceso al parámetro de tipo con ParameterizedType type = (ParameterizedType) foo.getClass().getGenericSuperclass()
y luego llamar a los métodos de ParameterizedType. Esta es la característica de la API de reflexión de Java que también aprovecha Guice.
¿Sería K.class.getSimpleName() también el truco? Han pasado más de 10 años desde que javé, así que me perdí los genéricos. Podría estar equivocado. – spender
Pero si la variable de elemento no se inicializa, ¿hay alguna otra forma de obtener el tipo sin obtener una excepción de puntero nulo? –
K.class no funcionará (probablemente ni siquiera compile). Y sí, necesita anular la verificación. Y no, no hay otra forma debido a borrado de tipos (no hay información de tiempo de ejecución sobre K a menos que la almacene usted mismo). – Thilo