当前位置: 首页 > 面试题库 >

如何从实现类中获取通用接口的类型参数?

公良骁
2023-03-14
问题内容

我有这个界面:

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

并实现该类:

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

在此案例中,Tparameter是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
Type。他们一定不是一个Class。在您的情况下,它是一个Class,因为您的类型定义是EventHandler<MyEvent>



 类似资料:
  • 问题内容: 说我有一个像这样的父接口/类 还有许多实现通用类型的实现接口。 我可以使用反射来获取的情况下代表我有没有为对象。像这样: 目前,我已经作为参数传递了,但是如果可以的话,我想简化一些事情。 问题答案: 是的,尽管什么其他人说,这个信息 是 可用的,如果你有机会到子类对象。您需要与一起使用。 在您的示例中,“实际”类型参数应返回for 。

  • 问题内容: 范例: 我想从引用变量中获取接口名称。有没有办法做到这一点? 问题答案: 使用反射,您可以调用返回您的类实现的方法。 为了得到名字

  • 问题内容: 我在编写的程序中遇到接口问题。我想创建一个接口,该接口的方法之一可以接收/返回对自己对象类型的引用。就像这样: 我不能在“?”处使用“ I”,因为我不想返回对接口的引用,而是要返回对类的引用。我搜索后发现在Java中没有“自我引用”的方法,因此我不能仅用“?”代替。在示例中,“ self”关键字或类似的内容。实际上,我想出了一个解决方案 但这似乎确实是一种解决方法或类似方法。还有另一种

  • 为什么我不能这样做?我得到编译错误。 那是Java8 我不认为这里违反了任何OO原则。 这真的让我很难实现通用 API...... (我试图将泛型从游戏中剔除,因为泛型API变得反直觉了)

  • 问题内容: 给定2个接口: 和一个具体的类: 如何找出传递给BaseInterface接口的类型参数? (我可以通过调用类似以下内容来检索ExtendedInterface类型参数 但我无法找到一种简便的方法来递归到任何基本的通用接口并获取有意义的东西)。 问题答案: 通常,这个问题不容易完全解决。例如,如果它是一个内部类,还必须考虑包含类的类型参数,… 因为仅使用Java本身提供的内容就很难对泛

  • 问题内容: 使用泛型时,我在Java中有一个小问题。我有一堂课: 在方法中,我需要获取类型名称。有没有办法找到字符串使用? (如果创建了,我希望能够做到这一点- 我必须使用通用性,因为我的方法之一必须返回)。 这似乎很容易,但是我不知道如何去做。 问题答案: 由于 类型擦除, 您通常无法执行此操作-的实例不 知道 的类型。如果需要,一种方法是使用类型文字: 然后: 这很丑陋,但这就是类型擦除的作用