为了账号安全,请及时绑定邮箱和手机立即绑定

将类对象作为泛型类型的 Java 泛型

将类对象作为泛型类型的 Java 泛型

跃然一笑 2021-06-28 13:59:32
我想为使用泛型定义的类创建一个 Java 对象。具体来说,我想创建一个在运行时确定的类的对象列表。我想要类似的东西Class clazz = Class.forName("MyClass"); List<clazz> myList = new ArrayList<>(); // This isn't allowed定义一个对象数组将允许我存储 MyClass 类型对象的列表,但这会导致每次从列表中获取对象时都转换对象,我想避免这种情况。有没有办法使用java.lang实现类似上面的代码。
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

好吧,既然你知道那个类,你可以(有警告)投射它List本身;但是您仍然需要知道类名并进行一些检查,例如:


if(clazz.getName().equals("java.lang.String")) {

     // warning here

     yourList = (List<String>) yourList; 

}


查看完整回答
反对 回复 2021-07-14
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

不,你不能。Java 中的泛型只是一种编译时类型检查机制。如果直到运行时才知道类型,那么显然它不能用于编译时类型检查。编译器无法在编译时确定允许您放入或取出 a 的类型List<clazz>,因此它仅比原始类型更有意义List


查看完整回答
反对 回复 2021-07-14
?
四季花海

TA贡献1811条经验 获得超5个赞

有一个小技巧可用于处理特定的未知类型:声明一个仅用于未知类型的类型参数:


public <T> void worksWithSomeUnknownClass() throws ReflectiveOperationException {

    @SuppressWarnings("unchecked")

    Class<T> clazz = (Class<T>) Class.forName("MyClass");


    T obj = clazz.getConstructor().newInstance();


    List<T> myList = new ArrayList<>();

    myList.add(obj);

}

但是,此解决方案非常有限。它可以确保您不会与其他未知类型或混合起来Object,但你真的不能做任何事情T。并且您必须在使用它的每个方法上声明一个类型参数。


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 244 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信