首页 > 解决方案 > 获取包含类型参数的 Generic 接口的 Class 实例

问题描述

假设我有一个接口GenericInterface

interface GenericInterface<T> {
    T get();
}

现在,例如,如果我想获得一个 Class 类型的对象Class<GenericInterface<String>>,如下所示:

public class Main {
    public static void main(String[] args) {
        Class<GenericInterface<String>> aClass = ...
    }
}

我该怎么做呢?GenericInterface<String>.class不起作用,并且GenericInterface.class只返回 a Class<GenericInterface>,没有类型参数。Class.forName("GenericInterface<java.lang.String>")也只是抛出一个ClassNotFoundException. 甚至有可能获得这样的对象吗?

标签: javagenericsreflection

解决方案


一方面,由于类型擦除,参数化类没有精确的表示。基本上,GenericInterface<String>.class将与GenericInterface<Long>.class.

另一方面,如果你真的需要这样的 Class 出于某种原因,仍然有一种(丑陋的)方法可以通过使用双重转换来获得它:

@SuppressWarnings("unchecked")
Class<GenericInterface<String>> cls = (Class<GenericInterface<String>>)(Object)GenericInterface.class;

推荐阅读