我想使用通用列表,但初始化方法只返回一个List.以下代码运行良好:
List tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
Run Code Online (Sandbox Code Playgroud)
Java指责我使用的是原始类型,我应该对列表进行参数化.所以我添加了问号参数化这个列表.
List<?> tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
Run Code Online (Sandbox Code Playgroud)
问题是:现在该add(..)方法不再起作用了.
我无法保证列表中只包含Strings,因为我的代码中aMethodToInitializeTheColumnList()没有实现.
我的错是什么?
谢谢!
gue*_*rda 28
来自泛型教程.感谢Michael的回答!
然而,向它添加任意对象是不安全的:
Run Code Online (Sandbox Code Playgroud)Collection<?> c = new ArrayList<String>(); c.add(new Object()); // Compile time error由于我们不知道c的元素类型代表什么,我们无法向其添加对象.add()方法接受类型为E的参数,即集合的元素类型.当实际类型参数为?时,它代表某种未知类型.我们传递给add的任何参数都必须是这种未知类型的子类型.因为我们不知道它是什么类型,所以我们无法传递任何内容.唯一的例外是null,它是每种类型的成员.
Rom*_*ain 16
如果使用<?>,则表示您不会在任何地方使用参数化类型.要么转到特定类型(在您的情况下似乎List<String>)或非常通用List<Object>
在这种情况下,另一种选择是将您的列表声明为a
List<? super String>
Run Code Online (Sandbox Code Playgroud)
因为这个模型正是你所了解的.你说你不确切知道它的类型边界是什么,但从你的第二行开始,假设它必须能够包含字符串是公平的.
在我看来,这比编译更好,List<Object>因为它编码了你的不确定性,以及列表中的实际内容.基本上,你只能向它添加字符串,但是当你调用get()返回的元素时可能是任何东西(并且Java将正确地推断出这种类型Object).
在实际应用中,这之间的唯一区别List<Object>是,后者将允许tmpColumnList.add(3)或者tmpColumnList.add(new Thread())等我更喜欢它所携带的语义以及实用性.
| 归档时间: |
|
| 查看次数: |
29601 次 |
| 最近记录: |