当前位置: 首页 > 面试题库 >

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

卫俊力
2023-03-14
问题内容

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

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

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

al.add("something");

现在,我之所以这样做而不是仅仅使用泛型,是因为泛型已经被大量使用,并且本例中的“
i”变量将被用作类型“?”。我真的不希望再使用其他泛型,因为这会给用户带来更多工作,并且在最终设计中灵活性会大大降低。有什么办法可以使用下面的内容(注意:下面的内容不起作用)。有人有主意吗?

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

问题答案:

您不能在使用通配符泛型定义的集合中添加对象。该线程可能会对您有所帮助。

确实,您正在创建一个集合,是的,是每个集合的超类型,因此可以分配给任何泛型集合。但这太笼统了,不允许进行任何类型的添加操作,因为编译器无法检查所添加内容的类型。这正是泛型的意思:类型检查。

我建议您阅读该线程,并注意它也适用于您想要执行的操作。

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



 类似资料:
  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 当我在使用JavaSpringHibernateStruts2Eclipse项目时。我使用buildpath->addjar选项从工作区内部的文件夹中添加JAR。即使类可用,也会显示class not found异常。 如果我把这些jar文件放在WEB-INF/lib文件夹中,一切正常。我应该将这些文件保存在lib中吗?我可以将这些jar包含在一个单独的文件夹中,然后使用eclipse confi

  • 我有以下问题: 我有这样一个函数: 我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。列表可在此处找到:https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.html 有没有一种方法可以在没有大量实例的情况下解决这个问题? 谢啦

  • 问题内容: 我想使用插入查询来检索表中的最新更新值。 这些是我的sql表中的数据类型。 数据类型: Java代码 堆栈跟踪 问题答案: 您需要致电:

  • 问题内容: 为什么下面 不行?只是为了学习而玩弄泛型,我希望我能够在其中插入任何扩展Collection的内容,但会出现此错误: 问题答案: 您已声明是的扩展名。但是根据Java编译器,它可以是 任何 扩展的元素,即。因此,出于这个原因,它必须禁止采用通用类型参数的操作。它不能让你的加入到这可能是。 尝试删除通配符: 这应该工作,因为你可以肯定是一个添加到的。

  • 我得到了一个XSD,其中包含一个字段。我希望生成的代码使用,这样我就可以对其应用现有接口。(该字段是必填字段,并且永远不会超过32位范围,它应该是)。 使用XJB,我可以更改生成代码中的类型。但是在创建时,这给了我一个错误。 这将生成以下代码 虽然这适用于代码生成,但它在编组时失败,并在创建上下文时引发以下异常。 如果我手动向注释添加一个type参数,问题就解决了,但是我找不到让JAXB为我做这件