Java 添加到未知类型泛型列表

标签 java generics reflection classloader

我遇到了以前在 Java 中从未遇到过的问题,也就是说,我需要在运行时创建一个新实例,例如 ArrayList 类,而不分配已知类型,然后将数据添加到列表中。这听起来有点含糊,所以这里有一个例子:

Class<?> c = i.getClass();

Constructor<?> con = ArrayList.class.getConstructor();
ArrayList<?> al = (ArrayList<?>)con.newInstance();

al.add("something");

现在我这样做而不是只使用泛型的原因是因为泛型已经被大量使用并且这个例子中的“i”变量将被指定为类型“?”。我真的不想加入另一个泛型,因为这会给用户带来更多的工作,并且最终设计的灵 active 会大大降低。有什么方法可以使用类似下面的东西(注意:下面的东西不起作用)。有人有想法吗?

ArrayList<c> al = (ArrayList<c>)con.newInstance();

最佳答案

您不能在使用通配符泛型定义的集合中添加对象。 This thread可能会帮助你。

确实,您正在创建一个集合,是的,它是每个集合的父类(super class)型,因此,可以将其分配给任何泛型集合;但是它太通用了,不允许任何类型的添加操作,因为编译器无法检查您要添加的内容的类型。这正是泛型的意义所在:类型检查。

我建议您阅读该主题,看看它是否也适用于您想做的事情。

您的集合太通用了,不允许添加任何内容。问题与赋值的右侧无关(使用单例或反射),它在使用通配符的左侧声明类型中。

关于Java 添加到未知类型泛型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515228/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java 语法如 Object(){}

java - 防止无限递归变量扫描

java - 使用反射创建对象及其声明字段的 JTree

java - 如何在 64 位 JRE MOC XOS 中运行 32 位 JAVA Applet

java - 找到两个字符串的交集

java - 在Android上制作一个随机移动的可点击按钮

.net - 泛型 hell 或在 .NET 中进行程序集级别类型参数化(程序集范围泛型)需要什么

java - list.toArray() 同意将 A 类型的项目传输到 B[] 类型的数组

java - 从父类(super class)创建 ArrayList 但包含扩展类的对象