List<String> someName = new ArrayList<String>();
ArrayList<String> someName = new ArrayList<String>();
答案 0 :(得分:6)
声明之间的区别更多是样式。最好使用抽象而不是具体实现来声明变量,因为您可以在以后更改实现选择而不更改变量类型。例如,您可以更改List以使用LinkedList。
如果您总是使用抽象类型(接口或抽象类),尤其是在方法签名中,客户端代码可以自由使用他们喜欢的任何实现。这使代码更灵活,更易于维护。
即使是变量声明也是如此。考虑一下:
public abstract class MyListUsingClass {
private List<String> list;
protected MyListUsingClass(List<String> list) {
this.list = list;
}
...
}
如果变量list
被声明为ArrayList
,那么构造函数中将只接受 ArrayLists。这将是一个糟糕的选择:总是尝试让客户端代码选择他们想要使用的实现。
关于你的上一个问题:接口对类的方法有相同的限制,所以是的,你可以overload methods。
答案 1 :(得分:2)
答案 2 :(得分:1)
LinkedList
实施 - 这对你的所有代码都不会那么有害LinkedList
或ArrayList
)或仅存储数组(电子邮件[])。如果您提供更多信息 - 这可能会有所帮助。编辑
2.在这两种情况下,它们都是字符串的ArrayList。区别在于,在第一种情况下,您正在进行超类的转换(无法访问特定于ArrayList
的某些方法)
答案 3 :(得分:1)
在第一个原因中,您声明了一个var类型列表并使用ArrayList作为其实现。
在第二种情况下,您要声明并定义数组列表。
不同之处在于,使用interface
类型(如第一种情况),您将只访问List
界面中定义的那些方法,如果ArrayList
具有某些特定的方法实现方法,为了访问它们,您需要将列表转换为其子类型(ArrayList)。
在第二种情况下,您使用的是更具体的类型,因此根本不需要强制转换。
答案 4 :(得分:1)
void draw()
方法的Cowboy和Artist接口,那么实现两者的类将必须决定单个实现将是什么。牛仔不能有一个,而艺术家也不能有,因为接口没有任何实现的概念。