首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >泛型和问号

泛型和问号
EN

Stack Overflow用户
提问于 2009-12-03 21:50:50
回答 3查看 31.2K关注 0票数 16

我想使用泛型列表,但是初始化方法只返回一个List。下面的代码运行良好:

代码语言:javascript
复制
List tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");

Java指责我使用的是原始类型,我应该将列表参数化。所以我在这个列表中添加了问号参数。

代码语言:javascript
复制
List<?> tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");

问题是:现在add(..)方法不再工作了。

我不能保证列表中只包含String,因为我的代码中没有实现aMethodToInitializeTheColumnList()

我的错误是什么?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2009-12-03 21:53:31

你可能想要使用List<String> --这就是泛型的用法,比如添加关于集合中对象类型的信息。如果你实际上要有一个包含混合类型的列表(这通常是一个糟糕的设计的标志),使用List<Object>

有关使用通配符的更多信息,请查看Generics Tutorial。但它们实际上只有在定义自己的泛型类或带有泛型参数的方法时才有意义。

票数 18
EN

Stack Overflow用户

发布于 2009-12-03 21:53:58

如果您使用<?>,您的意思是您将不会在任何地方使用参数化类型。要么转到特定类型(在您的例子中似乎是List<String>),要么转到非常通用的List<Object>

票数 16
EN

Stack Overflow用户

发布于 2009-12-03 23:37:02

这种情况下的另一种选择是将列表声明为

代码语言:javascript
复制
List<? super String>

因为这个模型就是你所知道的。您说您并不确切地知道它的类型界限是什么,但是从您的第二行可以公平地假设它必须能够包含字符串。

在我看来,这比List<Object>要好一点,因为它编码了你对列表中实际内容的不确定性。基本上,您只能向其中添加String,但是当您调用get()时,返回的元素可以是任何类型(并且Java将正确地推断该类型为Object)。

在实际中,这和List<Object>之间唯一的区别是后者允许tmpColumnList.add(3)tmpColumnList.add(new Thread())等。我更喜欢它所携带的语义以及实用性。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1839969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档