一般来说,为了对arrayList进行decalre,我们可以声明如下。
ArrayList Obj = new ArrayList();
这是正确的。但是在我们的代码中,我们不会这样做。我们按照下面的方式进行操作
List Obj = new ArrayList();
为什么我们会这样做?为什么要向上推广?
虽然Upcasting正在限制其功能。我们声明ArrayList或LinkedList的具体原因是什么?
答案 0 :(得分:6)
是 - 因为除非您需要仅通过具体类型公开的特定功能,否则通常最好引用更一般的类型。这样,如果您决定使用不同的实现,您就知道自己并不依赖于当前实现的任何特定内容。您可以稍后更改单个语句:
List<String> list = new ArrayList<String>();
到(比方说)
List<String> list = new LinkedList<String>();
并知道一切仍然会编译。当然,行为可以在性能,线程安全等方面发生变化 - 但无论如何都是如此。
您还表达,您不需要任何特定于ArrayList<String>
的成员,这在以后阅读代码时非常重要。
在选择方法的返回类型和参数类型时,所有这些都特别相关。您对返回类型的具体关注度越高,以后更改实现的灵活性就越低。您对参数类型的具体了解越多,您为来电者提供的灵活性就越低。
答案 1 :(得分:0)
重点是ArrayList
和LinkedList
都是使用作为列表。我们的程序逻辑不应该依赖如何存储列表,只是它们可以用于以有序的方式存储项目,可以根据这一事实进行访问。
答案 2 :(得分:0)
这不是向上倾斜。这是正确的工作方式。实际上当你使用List时,它是如何实现的并不重要。重要的是它是列表。您使用的所有方法都在界面中定义。所有其他类都是正确的。始终尝试使用赋值运算符左侧和您定义的接口中的接口。在这种情况下,将ArrayList更改为LinkedList很容易。只需在一个地方更改它:将new ArrayList
替换为new LinkedList
,您就完成了。
此外,在大多数情况下,您甚至不需要List。如果那时你只迭代元素就足以使用Collection了。因为Collection接口由列表和集合实现。因此,将来如果您希望将元素存储在集合中,您将再次只需执行一次更改。
答案 3 :(得分:0)
明确的答案可以在
中找到Joshua Bloch的Effective Java,第52项:通过接口引用对象。
答案 4 :(得分:0)
简单明了 - 多态性
您编程为更通用或抽象的类或接口类型(如List),Java的多态行为将能够在运行时自动找出实现的对象所属的实际定义。这里List是一个界面。
多态性有助于维护和重构,没有太多麻烦。如果您了解多态性,您就会知道这一点。
答案 5 :(得分:0)
ArrayList<String> list;
list = new ArrayList<String>(); //possible
list = new LinkedList<String>(); //not possible
LinkedList<String> list;
list = new ArrayList<String>(); //not possible
list = new LinkedList<String>(); //possible
但
List<String> list;
list = new ArrayList<String>(); //possible
list = new LinkedList<String>(); //possible
为了增加这种可能性你需要实际练习:P