java - 如何检索参数化类的类

标签 java generics

考虑以下代码:

public class Context {
    private final Class<?> clazz;
    private final String resource;
    private final com.thirdparty.Context context;

    public Context(final String resource, final Class<?> clazz) {
        this.clazz = clazz;
        this.resource = resource;
        this.context = com.thirdparty.Context.newInstance(this.clazz);
    }

    public String marshall(final Object element) {
        return this.context.marshall(element);
    }

    public Object unmarshall(final String element) {
        return this.context.unmarshall(element);
    }
}
Context context = new Context("request.xsd", Request.class);

// Marshall
Request request = new Request();
String xml = context.marshall(request);

// Unmarshall
Request roundTrip = Request.cast(context.unmarshall(xml));

我正在尝试用 Context 类的泛型版本替换它:

public class Context<T> {
    private final Class<T> clazz;
    private final String resource;
    private final com.thirdparty.Context context;

    public Context(final String resource) {
        this.clazz = initHere(); // <== HOW ??
        this.resource = resource;
        this.context = com.thirdparty.Context.newInstance(this.clazz);
    }

    public String marshall(final T element) {
        return this.context.marshall(element);
    }

    public T unmarshall(final String element) {
        return this.clazz.cast(this.context.unmarshall(element));
    }
}
Context<Request> context = new Context<>("request.xsd");

// Marshall
Request request = new Request();
String xml = context.marshall(request);

// Unmarshall
Request roundTrip = context.unmarshall(xml);

因此我没有将 .class 作为参数传递给构造函数,unmarshall 方法会自动转换返回对象。

我需要知道要传递给 newInstance() 方法并调用 cast() 方法的 T 类。即 T.class 或 T.getClass()。

在我的示例中,我试图在构造函数期间初始化 clazz 成员,以便我可以在两个位置使用它。

我尝试了以下方法:

this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

但是 getClass().getGenericSuperclass() 返回一个无法转换为 ParameterizedType 的对象。我不能使用任何第三方反射库,我需要坚持 Jdk 内部的标准机制。

最佳答案

你不能那样做。 在您的情况下,通用类型 T 链接到您的实例。反射数据绑定(bind)到类,你的类没有定义类型 T。

您尝试使用的代码只有在您定义了一个设置了 T 的类时才有效。

public class RequestContext extends Context<Request> {}

如果您使用此类的实例,那么您的代码应该可以正常工作。

关于java - 如何检索参数化类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48228512/

相关文章:

java - Java应用程序中的MVC模式

generics - 模数通用计数器

Swift 通用工厂 : Bug?

objective-c - 是否可以创建一个通用的 JSON 解析器?

java - 泛型:如何处理类层次结构中的多个有界类型

Java 正则表达式 : How to replace all character inside a bracket?

java - 由于字符串根据内容存储在字符串常量池中(当我们用 = 初始化它时),因此在这种情况下为什么 s1 == s3 false

java - 如何在空布局中设置jpanel的大小

java - Spring boot 1.5.6 - 记录垃圾收集 Activity

java - 如何处理 Java "annotation processor"中的泛型?