【问题标题】:Java valueOf method for generic class泛型类的Java valueOf 方法
【发布时间】:2021-07-12 19:30:39
【问题描述】:

给定一个泛型类Foo<T>,我想创建一个静态方法valueOf(String s)String s 应该包含一个类的名称(例如 "java.lang.Integer")。对valueOf("java.lang.Integer") 的调用应该会返回一个新对象Foo<Integer>

在我的类中(见下面的代码),我想存储Class<T>,它作为参数传递给构造函数Foo(Class<T> clazz)。但是在valueOf-方法中,我不确定将什么参数传递给我想返回的对象的构造函数Foo(Class<T> clazz)

由于我对 java 反射比较陌生,我不确定如何将这个逻辑实现到我的泛型类中。我了解到Class.forName(String) 方法返回一个对象Class<?>,但我不知道如何找出通配符的类型?代表(如果可以使用反射),还是我朝着这个方向走错了?

public class Foo<T> {
    private Class<T> clazz;
    public Foo(Class<T> clazz) {
        this.clazz = clazz;
    }

    public static <E> Foo<E> valueOf(String s) throws ClassNotFoundException {
        Class<?> clazz = Class.forName(s);
        // here i am stuck. I would like to return new Foo<E>, 
        // but what is E, E's class and therefore the parameter for the constructor?
    }
}

【问题讨论】:

  • "什么是 E,E 的类以及构造函数的参数?"你已经在 clazz 变量中有这个类。

标签: java generics tostring value-of


【解决方案1】:

你不能用泛型来做到这一点。泛型只是编译器静态地为您输入的类型。所以,如果你不能用你在代码中编写的强制转换来做到这一点(也就是说,你不能对不同的字符串有不同的强制转换),你也不能用泛型来做到这一点。

您需要某种键而不是 String 来传达类型 T/E。可以直接传入Class&lt;E&gt;

    public static <E> Foo<E> valueOf(Class<E> clazz) throws ClassNotFoundException {
        // ...
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多