每个声明之间有什么区别?每个声明的含义是什么?

时间:2010-10-13 08:45:22

标签: java generics collections

List listOne = new LinkedList<Shxx>();      
List<Shxx> listTwo = new LinkedList<Shxx>();
List listThree = new LinkedList();
List<Shxx> listFour = new LinkedList();

2 个答案:

答案 0 :(得分:7)

List listOne = new LinkedList<Shxx>();

丢弃类型信息,或许根本不使用泛型。

List<Shxx> listTwo = new LinkedList<Shxx>();

正确使用仿制药,提供类型安全。

List listThree = new LinkedList();

不使用泛型(即Java 5之前的代码),没有类型安全。

List<Shxx> listFour = new LinkedList();

将导致编译器警告,但是否则正常,因为该列表只能通过类型安全引用使用,并且最初为空。无论如何都不应该这样做,因为如果你忽略了关于原始类型使用的编译器警告,你也可能忽略那些不如此类的良性的其他人。从泛型中获得最大类型安全性的最佳方法是消除所有相关的编译器警告。

答案 1 :(得分:1)

listOnelistThree只能在代码中作为对象列表使用(另外,您的IDE可能会显示两者的警告,因为listOne的实例意味着未选中使用已检查的集合,而listThree的实例化是对应该是一个检查集合的原始用途。)

对于这两个论文列表,您将能够添加任何类型的对象(String作为典型示例)。

listTwo被声明为List的经典Shxx

对于此列表,编译器仅允许您添加Shxx类型的项目。

声明listFour编译,并使列表可用(如listTwo)作为List的{​​{1}}(但我不建议这样写)。

最后,虽然这些列表在您声明的代码中不能以相同的方式使用,但您必须知道它们在运行时都是等效的(但是您理论上无法在之前克服这些泛型限制很长一段时间)。