2015-01-16 2 views
2

У меня есть следующий интерфейс: interface Nofifier<T> { }.Получить общий параметр реализации интерфейса

У меня есть следующая реализация: class MyClass implements Notifier<String>, Notifier<Integer> { }.

Есть ли способ я могу запросить от:

MyClass instance = new MyClass(); 
Class<?> clazz = instance.getClass(); 
// ... 

, чтобы получить типы Notifier что MyClass орудий?

ответ

3

Да - вы можете позвонить по телефону Class.getGenericInterfaces(), который возвращает Type[]. Это включает информацию о аргументах типа.

Полный пример:

import java.lang.reflect.Type; 

interface Notifier<T> { } 

class Foo implements Notifier<String> { 
} 

class Test { 
    public static void main(String[] args) { 
     Class<?> clazz = Foo.class; 
     for (Type iface : clazz.getGenericInterfaces()) { 
      System.out.println(iface); 
     } 
    } 
} 

Однако, вы не можете реализовать тот же интерфейс, дважды на одном классе в любом случае, так что ваш class MyClass implements Notifier<String>, Notifier<Integer> не должны компилировать. Вы должны получить сообщение об ошибке, таких как:

error: Notifier cannot be inherited with different arguments: 
    <java.lang.String> and <java.lang.Integer> 

От JLS 8.1.5:

Класс не может одновременно быть подтипом двух типов интерфейсов, которые разные параметризация одного и того же универсального интерфейса (§ 9.1.2) или подтип параметризации общего интерфейса и необработанного типа, называющего тот же общий интерфейс, или ошибка времени компиляции.

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