3 回答

TA贡献1783条经验 获得超4个赞
您这样做的主要原因是将代码与特定的接口实现分离。当你编写这样的代码时:
List list = new ArrayList();
其余的代码只知道数据是类型的List
,这是更好的,因为它允许您List
轻松地在接口的不同实现之间切换。
例如,假设您正在编写一个相当大的第三方库,并说您决定使用一个实现库的核心LinkedList
。如果您的图书馆在很大程度上依赖于访问这些列表中的元素,那么最终您会发现您做出了糟糕的设计决策; 你会意识到你应该使用a ArrayList
(它给出O(1)访问时间)而不是a LinkedList
(它给出O(n)访问时间)。假设您已经编程到接口,那么进行这样的更改很容易。你只需要更改List
from 的实例,
List list = new LinkedList();
至
List list = new ArrayList();
并且您知道这将有效,因为您已编写代码以遵循List
接口提供的合同。
另一方面,如果您使用了库的核心LinkedList list = new LinkedList()
,那么进行这样的更改将不会那么容易,因为无法保证您的其余代码不会使用特定于LinkedList
该类的方法。
总而言之,选择只是设计问题......但这种设计非常重要(特别是在处理大型项目时),因为它可以让您在不破坏现有代码的情况下进行特定于实现的更改。

TA贡献1864条经验 获得超6个赞
这称为编程接口。如果您希望将来转移到List的其他实现,这将非常有用。如果你想要一些方法,ArrayList
你需要编程实现ArrayList a = new ArrayList()
。

TA贡献1794条经验 获得超7个赞
这在暴露公共接口时也很有用。如果你有这样的方法,
public ArrayList getList();
然后你决定改成它,
public LinkedList getList();
任何正在做的人ArrayList list = yourClass.getList()
都需要更改他们的代码。另一方面,如果你这样做,
public List getList();
更改实施不会改变API用户的任何内容。
添加回答
举报