我想使用泛型列表,但是初始化方法只返回一个List
。下面的代码运行良好:
List tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
Java指责我使用的是原始类型,我应该将列表参数化。所以我在这个列表中添加了问号参数。
List<?> tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
问题是:现在add(..)
方法不再工作了。
我不能保证列表中只包含String
,因为我的代码中没有实现aMethodToInitializeTheColumnList()
。
我的错误是什么?
谢谢!
发布于 2009-12-03 21:53:31
你可能想要使用List<String>
--这就是泛型的用法,比如添加关于集合中对象类型的信息。如果你实际上要有一个包含混合类型的列表(这通常是一个糟糕的设计的标志),使用List<Object>
有关使用通配符的更多信息,请查看Generics Tutorial。但它们实际上只有在定义自己的泛型类或带有泛型参数的方法时才有意义。
发布于 2009-12-03 21:53:58
如果您使用<?>
,您的意思是您将不会在任何地方使用参数化类型。要么转到特定类型(在您的例子中似乎是List<String>
),要么转到非常通用的List<Object>
发布于 2009-12-03 23:37:02
这种情况下的另一种选择是将列表声明为
List<? super String>
因为这个模型就是你所知道的。您说您并不确切地知道它的类型界限是什么,但是从您的第二行可以公平地假设它必须能够包含字符串。
在我看来,这比List<Object>
要好一点,因为它编码了你对列表中实际内容的不确定性。基本上,您只能向其中添加String,但是当您调用get()
时,返回的元素可以是任何类型(并且Java将正确地推断该类型为Object
)。
在实际中,这和List<Object>
之间唯一的区别是后者允许tmpColumnList.add(3)
或tmpColumnList.add(new Thread())
等。我更喜欢它所携带的语义以及实用性。
https://stackoverflow.com/questions/1839969
复制相似问题