Java Generics初学者 - 关于类型安全声明和实例化的编译器警告

时间:2011-11-28 02:01:02

标签: java generics

如果我声明并实例化一个新的类型安全集合,如下面的

,编译器会发出警告
List<String> list = new ArrayList(); // compiler warning
List<String> anotherList = new ArrayList<String>(); //this is normal and ok.

list对象似乎是类型安全的,因为我不能放入除String之外的任何其他对象。那么,使用这样的声明是否有任何陷阱?

2 个答案:

答案 0 :(得分:6)

因为你可以这样做:

ArrayList foo = new ArrayList();
foo.add(new Integer(5));
List<String> list = foo;  // compiler warning

但这会打破List<String>只应包含String的合同。这就是你得到警告的原因;通常混合原始类型和泛型类型是不好的做法。

答案 1 :(得分:1)

这取决于你的陷阱是什么意思。我会说不。通用版确保您的列表仅接受字符串。我认为这是件好事。如果你需要一个List,你需要存储除Strings以外的东西,那么这将不起作用。即便如此,我还会考虑是否可以创建一个接受所需值类型的自定义类,然后使用自定义类创建一个通用List:

List<MyClass> list = new ArrayList<MyClass>();