我有这个界面:

public interface EventHandler<T extends Event> {
    void handle(T event);
}


并实现该类:

public class MyEventHandler implements EventHandler<MyEvent> {
    @Override
    public void handle(MyEvent event) {
        //do something
    }
}


在此案例中,T参数是MyEvent,这是Event的具体实现。如何使用反射获取此信息?

最佳答案

通过通用接口解析T的类型。例如。

public interface SomeInterface<T> {
}

public class SomeImplementation implements SomeInterface<String> {

    public Class getGenericInterfaceType(){
        Class clazz = getClass();
        ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericInterfaces()[0];
        Type[] typeArguments = parameterizedType.getActualTypeArguments();
        Class<?> typeArgument = (Class<?>) typeArguments[0];
        return typeArgument;
    }
}

public static void main(String[] args) {
    SomeImplementation someImplementation = new SomeImplementation();
    System.out.println(someImplementation.getGenericInterfaceType());
}


PS:请记住acutalTypeArguments的类型为Type。它们不能是Class。在您的情况下,这是一个类,因为您的类型定义为EventHandler<MyEvent>

关于java - 如何从实现类中获取通用接口(interface)的类型参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60261576/

10-13 21:29