Java添加到未知类型的通用列表

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

Class c = i.getClass(); Constructor con = ArrayList.class.getConstructor(); ArrayList al = (ArrayList)con.newInstance(); al.add("something"); 

现在我这样做而不仅仅使用generics的原因是因为generics已经被大量使用而且这个例子中的“i”变量将被用作类型“?”。 我真的不想抛弃另一个generics,因为这会给用户带来更多的工作,并且在最终设计中会更不灵活。 有没有办法使用下面的东西(注意:下面的内容不起作用)。 有人有想法吗?

 ArrayList al = (ArrayList)con.newInstance(); 

您无法在使用通配符generics定义的集合中添加对象。 这个主题可能对你有帮助。

事实上,你正在创建一个集合,是的,每个集合的超类型,因此,可以分配给任何generics集合; 但是它太通用了,不允许任何类型的添加操作,因为编译器无法检查你要添加的内容的类型。 而这正是generics的意思:类型检查。

我建议你阅读post,看看它也适用于你想做的事情。

您的集合太通用了,无法添加任何内容。问题与asignment的右侧无关(使用单例或reflection),它位于使用通配符的左侧声明类型中。

如果我明白你的意思,你有一个C类,它在编译时是未知的,你想以类型安全的方式创建一个ArrayList 。 这个有可能:

 Class c = ...; ArrayList al = listOf(c); static  ArrayList listOf(Class clazz) { return new ArrayList(); } 

这是理论上正确的做法。 但谁在乎。 我们都知道类型擦除,并且Java不会丢弃类型擦除并为类型参数添加运行时类型。 因此,只要您知道自己在做什么,就可以使用原始类型并自由投射。

你可以使用ArrayList ,你可以add()任何东西。