2010-12-11 71 views
3

有人可以解释这两个类的ArrayList类的两个实例之间有什么不同吗?实例化通用类时传递类型变量

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

我知道,编译器擦除型变量,即Integer,它当编译成字节码和上述的例子都工作方式完全相同。我想知道是否有任何好处让右边的类型变量(Integer)通过,因为它已经在左边声明了?就我能在网上找到的,他们都使用后者,但我看不出有什么理由为什么我应该在两边申报两次。

+1

有钻石运算符('<>')项目投币功能,我认为它在JDK7中,它允许您编写'列表 ints = new ArrayList <>();'。确定类型的算法与通用方法的工作方式大致相同。 – 2010-12-11 13:52:33

+0

我期待着JDK7中的新功能。这个不错。 – gigadot 2010-12-11 14:19:40

回答

2

没有类型参数的版本会产生警告,因为它可能不是类型安全的。在你的情况下,这不是一个问题,因为列表是空的,但总的来说是这样。例如

List<String> stringList = new ArrayList<String>(); 
stringList.add("foo"); 
List<Integer> intList = new ArrayList(stringList); // Warning about unchecked conversion 
int i = intList.get(0); // Oops, throws a ClassCastException 

所以为了确保类型安全,最好通过在任何地方添加类型参数来摆脱警告。

3

他们是两回事。左侧是您的变量的类型。右侧是您正在创建的对象的类型。编译器将首先使用您在右侧给出的类型创建对象,然后将引用分配给左侧的变量。

在你的情况下,没有区别,因为ArrayList在所有情况下都具有相同的构造函数。但是:

  • 在其他类中,基于您提供的特定类型,构造函数的行为可能会有所不同。
  • 如果匹配类型,编译器会更容易。在第一个版本中,编译器必须将类型为ArrayList的对象分配给期望类型为List<Integer>的变量。在某些情况下,您可能会收到警告,因为类型没有明显匹配。
0

你可能想的区别:他们都在运行时相同

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

。但编译时间有很大差异。