获取接口实现的通用参数

时间:2015-01-16 13:55:15

标签: java

我有以下界面:interface Nofifier<T> { }

我有以下实现:class MyClass implements Notifier<String>, Notifier<Integer> { }

我可以通过以下方式查询:

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

获取Notifier实现的MyClass类型?

1 个答案:

答案 0 :(得分: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节)的不同参数化,或者是通用接口的参数化的子类型和原始类型命名相同的通用接口,或发生编译时错误。