Проверьте, реализует ли общий T интерфейс

поэтому у меня есть этот класс в Java:

public class Foo<T>{
}

и внутри этого класса я хочу знать, реализует ли T определенный интерфейс.

Следующий код НЕ работает, но это идея того, чего я хочу выполнить:

if(T.class implements SomeInterface){
    // do stuff
}

поэтому я хочу проверить, прошел ли класс T, который был передан Foo, implements SomeInterface в его сигнатуре.

Возможно ли это? Как?

Ответы

Ответ 1

Обобщенные, как ни странно, используйте extends для интерфейсов. 1 Вы хотите использовать:

public class Foo<T extends SomeInterface>{
    //use T as you wish
}

Это на самом деле требование для реализации, а не проверка истина/ложь.

Для проверки подлинности/ложного использования используйте неограниченные генерики (class Foo<T>{) и убедитесь, что вы получили Class<T>, чтобы у вас был тип, который можно использовать:

if(SomeInterface.class.isAssignableFrom(tClazz));

где tClazz - параметр типа java.lang.Class<T>.

Если вы получите параметр типа, подлежащего декларированию, то это не более чем:

if(tParam instanceof SomeInterface){

но это не будет работать только с общим объявлением.

1 Если вы хотите потребовать расширения класса и нескольких интерфейсов, вы можете сделать следующее: <T extends FooClass & BarInterface & Baz> Класс (только один, поскольку нет множественного наследования в Java) должен идти первым, и любые интерфейсы после этого в любом порядке.

Ответ 2

вы можете проверить его, используя isAssignableFrom

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

или получить массив интерфейса как

Class[] intfs = clazz.getInterfaces();

Ответ 3

Используйте isAssignableFrom()

isAssignableFrom() определяет, является ли класс или интерфейс, представленные этим объектом класса, такими же, как или суперкласс или суперинтерфейс, класс или интерфейс, представленные указанным параметром класса.

if (SomeInterface.class.isAssignableFrom(T class)) {
  //do stuff
}