之间有什么区别
List list = new ArrayList<Integer>();
和
List<Integer> list = new ArrayList<Integer>();
答案 0 :(得分:3)
通过做:
List list = new ArrayList<Integer>();
你没有告诉编译器它是什么类型的List。 这将允许某人编译此代码:
String a = (String)list.get(0);
这显然是错误的并且会导致异常,因为您可以在列表中添加任何内容,因此编译器不确定list.get(0)是否真的是整数。
现在用这种方式告诉编译器这个列表只接受并保存整数或整数子类(如果它可以被子类化)。
List<Integer> list = new ArrayList<Integer>();
所以这不会编译:
String b = (String)list.get(0);
答案 1 :(得分:1)
在第一种情况下,当您执行list.get(i)
时,它将返回Object
。在第二种情况下,它将返回Integer
。将List<Integer>
视为更具体的List
类型(有点像OOP中的子类)。
答案 2 :(得分:1)
不同之处在于,当您使用第一个声明时,您没有获得泛型提供的任何类型安全的好处 - 这是毫无意义的。
答案 3 :(得分:1)
扩展@Ernest的答案(这是准确的),这里有一些使用上的差异:
List untypedList = new ArrayList<Integer>();
List<Integer> typedList = new ArrayList<Integer>();
// What using the untyped list looks like
for (Object element : untypedList) { // The best we can do is get an Object
Integer i = (Integer)element; // "no-value" code
// do something with i
}
// or, cast to a typed list
for (Integer i : (List<Integer>)untypedList) { // ugly cast
// do something with i
}
// But with a typed list, things are neater (less code = good)
for (Integer i : typedList) {
// do something with i
}