如果我声明并实例化一个新的类型安全集合,如下面的
,编译器会发出警告List<String> list = new ArrayList(); // compiler warning
List<String> anotherList = new ArrayList<String>(); //this is normal and ok.
list对象似乎是类型安全的,因为我不能放入除String之外的任何其他对象。那么,使用这样的声明是否有任何陷阱?
答案 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>();