泛型和问号

2022-09-03 03:11:23

我想使用泛型列表,但初始化方法仅返回.以下代码运行良好:List

List tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");

Java指责我使用的是原始类型,我应该对列表进行参数化。因此,我添加了问号参数化此列表。

List<?> tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");

问题是:现在该方法不再有效。
我不能保证该列表仅包含在我的代码中未实现的s。add(..)StringaMethodToInitializeTheColumnList()

我的错误是什么?

谢谢!


答案 1

从泛型教程。感谢迈克尔的回答

但是,向其添加任意对象是不安全的:

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error

由于我们不知道c的元素类型代表什么,因此我们无法向其添加对象。add() 方法采用类型 E(集合的元素类型)的参数。当实际类型参数为 ?时,它代表某个未知类型。我们传递到添加的任何参数都必须是此未知类型的子类型。由于我们不知道那是什么类型,因此我们无法传入任何内容。唯一的例外是 null,它是每种类型的成员。


答案 2

您可能希望使用 - 这就是泛型的使用方式,即添加有关集合中将包含哪种对象的信息。如果你真的要有一个包含混合类型的列表(这通常是设计不好的标志),请使用List<String>List<Object>

有关通配符使用的详细信息,请参阅泛型教程。但是,它们实际上仅在定义自己的泛型类或具有泛型参数的方法时才相关。


推荐