可能重复:
Why should the interface for a Java class be prefered?
在Java中,这两行之间有区别吗?如果是这样,它是什么,我什么时候应该使用其中任何一个?是否有首选惯例?
请注意,ArrayList实现了List。
List<String> bunchOfStrings = new ArrayList<String>();
ArrayList<String> bunchOfStrings = new ArrayList<String>();
答案 0 :(得分:2)
在Java中,这两行之间有区别吗?
是的,存在细微差别,首选List<String>
变体。
是否有首选惯例?
约定说你应该“针对接口编程”。原因是交换实际实现变得容易得多(在这种情况下从ArrayList
到LinkedList
)。
答案 1 :(得分:1)
您应该使用最通用的类型。所以在这种情况下是List
。您使用更具体类型的唯一时间是,如果该类型上定义了方法,则更通用的类型不会。
原因是如果方法接受类型List
,则该方法的用户可以提供他们想要的任何类型的列表。如果方法只接受ArrayList,则用户不能使用任何其他类型的List。
答案 2 :(得分:1)
在这两种情况下,您都要实例化一个ArrayList。不同之处在于,在第一种情况下,您将其称为List(ArrayList实现的接口),因此您无权访问ArrayList类的特定方法,而只能访问interfaces方法。
首先使用:
List<String> bunchOfStrings = new ArrayList<String>();
这样你可以切换不同的List实现(ArrayList,Vector):
public class AClass(){
List<String> bunchOfStrings;
public List<String> getList(){
bunchOfStrings = new ArrayList<String>();
//or you can switch to : bunchOfStrings = new Vector<String>();
return bunchOfString;
}
}
答案 3 :(得分:0)
如果您将bunchOfStrings
声明为List
,则无法调用任何ArrayList
方法(无需转换),即使它指向ArrayList
object - 您只能调用List
类中声明的方法。
出于这个原因,您可能认为最好始终声明您的变量类型尽可能具体,但通常更喜欢将其声明为List
,因为它允许您更改您的基础实现List
,无需更改代码中的任何其他内容。您可以按照以下方式轻松修改代码,而不会破坏代码中的任何其他内容:
List<String> bunchOfStrings = new LinkedList<String>();
根据经验,如果你......只会声明变量的类型是特定的子类...
答案 4 :(得分:0)
这称为Polymorphism。它非常有用,并没有真正的缺点。
优点:
您可以将此实例变量发送到任何需要“List”对象的方法。
在方法声明中使用List,您将方法打开到List的子类型,而不仅仅是ArrayList类型。
缺点:
您必须将变量转换为ArrayList才能访问或设置ArrayList中的任何功能/方法/字段(但不在List中)。但那些东西仍然可用。