泛型中不同赋值的区别

时间:2011-08-05 04:08:36

标签: java generics

之间有什么区别
 List list = new ArrayList<Integer>();

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

4 个答案:

答案 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
}