2013-09-13 6 views
15

поэтому у меня есть этот класс в Java:Проверьте общий T реализует интерфейс

public class Foo<T>{ 
} 

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

Следующий код не работает, но это идея о том, что я хочу сделать:

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

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

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

ответ

37

Дженерики, как ни странно, также используют extends для интерфейсов. Вы хотите использовать:

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

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

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

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

где tClazz является параметром типа java.lang.Class<T>.

Если вы получаете параметр refiable типа, то это не более чем:

if(tParam instanceof SomeInterface){ 

, но это не будет работать только с общей декларацией.

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

+1

привет. Мне действительно нужна проверка true/false, потому что я изменяю существующий класс. Я пробую ваш второй код, но до сих пор не знаю, откуда пришел tClass. Любая помощь по этому поводу? – Budius

+1

@Budius Вашему пользователю необходимо в какое-то время передать либо 'Class ' из 'someInstanceOfT.getClass()', либо передать экземпляр 'T'. Стирание типа не позволит вам получить его в противном случае. – hexafraction

+1

, поэтому я не могу использовать фактический общий 'T' для проверки интерфейса, я буду использовать его во время' public void add (T object) {...} 'и проверять его на' object' , – Budius

4

вы можете проверить его с помощью IsAssignableFrom

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

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

Class[] intfs = clazz.getInterfaces(); 
+0

OP нуждается в надежном типе, чтобы получить 'clazz', возможно, как принятие класса ' в качестве параметра или при построении. – hexafraction

0

Использование isAssignableFrom()

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

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

Не работает, стирайте тип. И объект 'T Class 'недопустим синтаксис. Вы имеете в виду экземпляр 't'? – hexafraction

+0

@hexafraction изменен мой ответ –

Смежные вопросы