关于arraylist upcasting

时间:2011-07-21 05:58:27

标签: java

一般来说,为了对arrayList进行decalre,我们可以声明如下。

ArrayList  Obj =  new ArrayList();

这是正确的。但是在我们的代码中,我们不会这样做。我们按照下面的方式进行操作

List Obj = new ArrayList();

为什么我们会这样做?为什么要向上推广?

虽然Upcasting正在限制其功能。我们声明ArrayList或LinkedList的具体原因是什么?

6 个答案:

答案 0 :(得分:6)

是 - 因为除非您需要仅通过具体类型公开的特定功能,否则通常最好引用更一般的类型。这样,如果您决定使用不同的实现,您就知道自己并不依赖于当前实现的任何特定内容。您可以稍后更改单个语句:

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

到(比方说)

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

并知道一切仍然会编译。当然,行为可以在性能,线程安全等方面发生变化 - 但无论如何都是如此。

您还表达,您不需要任何特定于ArrayList<String>的成员,这在以后阅读代码时非常重要。

在选择方法的返回类型和参数类型时,所有这些都特别相关。您对返回类型的具体关注度越高,以后更改实现的灵活性就越低。您对参数类型的具体了解越多,您为来电者提供的灵活性就越低。

答案 1 :(得分:0)

重点是ArrayListLinkedList都是使用作为列表。我们的程序逻辑不应该依赖如何存储列表,只是它们可以用于以有序的方式存储项目,可以根据这一事实进行访问。

答案 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