¿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
type
como 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
T
se usa elClass
tipo 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