我是Java新手。 我想知道的区别: 什么是Java中的List或ArrayList声明差异?
ArrayList<String> list = new ArrayList<>();
感谢
List<String> list = new ArrayList<>();
和
ArrayList<String> list = new ArrayList<String>();
和
我是Java新手。 我想知道的区别: 什么是Java中的List或ArrayList声明差异?
ArrayList<String> list = new ArrayList<>();
感谢
List<String> list = new ArrayList<>();
和
ArrayList<String> list = new ArrayList<String>();
和
第一种是只因为Java 7的有效的,并且是相当于
List<String> list = new ArrayList<String>();
这只是不够详细。
相同的第三个,即相当于
ArrayList<String> list = new ArrayList<String>();
,从而严格等同于第二个。
你应该更喜欢第一个,在答案中提到的以下问题的原因:List versus ArrayList as reference type?
有两点此言这里:
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<>();
您正在使用的事实,ArrayList
是List
一个亚型,因此,分配是有效的。但是,对于新的list
对象,您只有List
中包含的方法的子集(因为您的对象毕竟被声明为List
),但实现中存在ArrayList
。这在面向对象编程中被称为多态性,并且允许您使用类的子类型而不是父类,以便提供各种不同的功能。
三人都有点相当于:
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'。