java - programacion - palabra reservada instanceof
Compruebe si un T genérico implementa una interfaz (3)
entonces tengo esta clase en Java:
public class Foo<T>{
}
y dentro de esta clase, quiero saber si T implementa cierta interfaz.
El siguiente código NO funciona, pero es la idea de lo que quiero lograr:
if(T.class implements SomeInterface){
// do stuff
}
así que quiero comprobar si la clase T
que se pasó a Foo tiene implements SomeInterface
en su firma.
¿Es posible? ¿Cómo?
Genéricos, curiosamente, el uso también se extends
a las interfaces. 1 Querrá usar:
public class Foo<T extends SomeInterface>{
//use T as you wish
}
Esto es realmente un requisito para la implementación, no una verificación de verdadero / falso .
Para una verificación de verdadero / falso, use genéricos ilimitados ( class Foo<T>{
) y asegúrese de obtener una Class<T>
para que tenga un tipo refinable:
if(SomeInterface.class.isAssignableFrom(tClazz));
donde tClazz
es un parámetro de tipo java.lang.Class<T>
.
Si obtiene un parámetro de tipo recuperable, entonces no es más que:
if(tParam instanceof SomeInterface){
pero esto no funcionará solo con la declaración genérica.
1 Si desea requerir la extensión de una clase y múltiples interfaces, puede hacer lo siguiente: <T extends FooClass & BarInterface & Baz>
La clase (solo una, ya que no hay herencia múltiple en Java) debe ir primero , y cualquier interfaz después de eso en cualquier orden.
Usar isAssignableFrom()
isAssignableFrom () determina si la clase o interfaz representada por este objeto de Clase es la misma, o es una superclase o superinterfaz de, la clase o interfaz representada por el parámetro de Clase especificado.
if (SomeInterface.class.isAssignableFrom(T class)) {
//do stuff
}
puedes verificarlo usando isAssignableFrom
if (YourInterface.class.isAssignableFrom(clazz)) {
...
}
o para obtener la matriz de interfaz como
Class[] intfs = clazz.getInterfaces();