¿Hay alguna forma de determinar si un objeto es una instancia de un tipo genérico?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
Eso claramente no funciona. ¿Existe alguna alternativa? Quiero usar la reflexión de Java para crear una instancia de una clase y luego verificar que sea de tipo genérico T.
java
generics
instanceof
Nikordaris
fuente
fuente

typecomo parámetro de método, tal vez desee inicializarlo:Class type = ((T) new Object()).getClass();Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];Para ampliar la muestra de Mark Peters, a menudo desea hacer algo como:
Class<T> type; //maybe passed to the method if ( type.isInstance(obj) ) { T t = type.cast(obj); // ... }fuente
Si no desea pasar el tipo de clase como parámetro como lo menciona Mark Peters, puede usar el siguiente código. Felicitaciones a David O'Meara.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; if (type.isInstance(obj)) { ... }fuente
Type safety: Unchecked cast from Type to Class<T>Podrías intentar esto
// Cast your object to the generic type. T data = null; try { data = (T) obj; } catch (ClassCastException cce) { // Log the error. } // Check if the cast completed successfully. if(data != null) { // whatever.... }fuente
Tendría más sentido restringir dónde
Tse usa elClasstipo para parametrizar el tipo. Cuando pasa el tipo, en lugar de usar algo comoClass<?>, debe usarClass<? extends T>.fuente
Esto solo funcionará (en parte) si tiene un objeto de tipo T. Entonces puede obtener la clase de ese objeto, consulte
java.lang.Class<T>y encontrar si es el mismo que el objeto en cuestión.Pero tenga en cuenta que esto va en contra de la razón por la que tenemos genrics: usar un tipo genérico es una forma de decir que no le importa qué tipo es realmente (hasta los límites superior e inferior que se pueden especificar).
fuente