2014-04-05 108 views

回答

11

真的没有区别,但第二个会给你一个编译警告。

它们编译为相同的字节码,因为编译器会抛弃有关您使用的类型参数的信息。

问题是ArrayList类是在泛型之前发明的,所以我们以前总是不得不将它创建为new ArrayList(),而没有指定类型参数。现在使用泛型,我们可以指定将存储在ArrayList中的对象类型,并让编译器检查我们是否正确使用它。这样做的符号就是你在第一个例子中使用的符号。

但是,编译器随后执行的任何检查都基于变量的类型,而不是您创建的类的类型,因此,在最初的编译器警告之后,差异根本不起作用。

从Java 7开始,编写此文件的首选方式是List<String> stringList = new ArrayList<>();,但是此早期版本的Java中不提供此标记。

+0

什么时候我们要停止提到泛型之前的时间? –

+0

@SotiriosDelimanolis当Oracle尝试产生一个体面的日期/时间API时,最终会提供一些仅代表2004年以后的日期,当然。 –

+0

是的,我出生于2004年。我不认为世界在此之前就存在:) –

4

这两个名称都不好:变量的名称应该反映它的内容。我已经知道这是一个变量,我已经知道这是一个列表。

什么是在列表中?例如:如果是小狗的包包我刚买的宠物商店:

List<Puppy> puppies = new ArrayList<>() 

注意我是如何省略型:这是可能的,因为Java 7的,是完全一样

List<Puppy> puppies = new ArrayList<Puppy>() 
+0

我省略了第一部分,没有看到两个都被声明为'List '。我会留下关于命名的评论,David已经讨论了这个实例。 –

0

它们混合通用和非通用类型。考虑这一点,

List<Double> t = new ArrayList(); 
List<String> stringList = new ArrayList(t); 

显然,可以在运行时炸毁。 Type erasure确实是一个性能提升,但它意味着泛型只是一个编译时检查,

// This is a compile error. 
List<Double> t = new ArrayList<Double>(); 
List<String> stringList = new ArrayList<String>(t); 

最后,在Java 7+可以使用diamond operator -

// This is a compile error. 
List<Double> t = new ArrayList<>(); 
List<String> stringList = new ArrayList<>(t); 
相关问题