2012-01-15 67 views

回答

11

第一种是只因为Java 7的有效的,并且是相当于

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

这只是不够详细。

相同的第三个,即相当于

ArrayList<String> list = new ArrayList<String>(); 

,从而严格等同于第二个。

你应该更喜欢第一个,在答案中提到的以下问题的原因:List versus ArrayList as reference type?

2

有两点此言这里:

1.新的Java 7的钻石运营商允许你在不指定类型参数的情况下实例化一个泛型类。所以这两者是等价的:

ArrayList<String> list = new ArrayList<String>(); 
ArrayList<String> list = new ArrayList<>(); 

2,更重要的一点是前两个实例之间的区别。第二个是明确的:

ArrayList<String> list = new ArrayList<String>(); 

在第一个:

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

您正在使用的事实,ArrayListList一个亚型,因此,分配是有效的。但是,对于新的list对象,您只有List中包含的方法的子集(因为您的对象毕竟被声明为List),但实现中存在ArrayList。这在面向对象编程中被称为多态性,并且允许您使用类的子类型而不是父类,以便提供各种不同的功能。

4

三人都有点相当于:

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

在上面,你宣布一个实现List界面将包含String元素,并与具体类ArrayList实例化它的变量。另外,您正在使用Java 7的新钻石语法,子不用再写之间的<>

ArrayList<String> list = new ArrayList<String>(); 

在上面,你声明的具体类ArrayList的一个变量,它包含String元素,并使用了“传统”的语法,责成具体类ArrayList实例化它,你指定String类型在<>之间。

ArrayList<String> list = new ArrayList<>(); 

在上面,你声明的具体类ArrayList其中将包含String元素,并与具体类ArrayList实例化它的变量。另外,您正在使用Java 7的新钻石语法,子不用再写之间的<>

请注意,钻石语法(<>)仅适用于Java 7及更高版本,对于使用传统语法(<the-type>)实例化泛型的Java先前版本。

最后两种形式完全相同;第一种形式有点不同,因为您指定list变量的类型为List而不是ArrayList类型 - 这是首选形式,因为良好的面向对象的实践规定您应该使用program to an 'interface', not an 'implementation'