为了账号安全,请及时绑定邮箱和手机立即绑定

多态性:为什么使用“List list = new ArrayList”

多态性:为什么使用“List list = new ArrayList”

浮云间 2019-08-15 14:42:03
多态性:为什么使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”?我什么时候应该使用List<Object> list = new ArrayList<Object>();ArrayList继承自List,所以如果某些功能ArrayList不在List,那么我将失去一些功能ArrayList,对吧?编译器在尝试访问这些方法时会注意到错误?
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您这样做的主要原因是将代码与特定的接口实现分离。当你编写这样的代码时:

List list = new ArrayList();

其余的代码只知道数据是类型的List,这是更好的,因为它允许您List轻松地在接口的不同实现之间切换。

例如,假设您正在编写一个相当大的第三方库,并说您决定使用一个实现库的核心LinkedList。如果您的图书馆在很大程度上依赖于访问这些列表中的元素,那么最终您会发现您做出了糟糕的设计决策; 你会意识到你应该使用a ArrayList(它给出O(1)访问时间)而不是a LinkedList(它给出O(n)访问时间)。假设您已经编程到接口,那么进行这样的更改很容易。你只需要更改Listfrom 的实例,

List list = new LinkedList();

List list = new ArrayList();

并且您知道这将有效,因为您已编写代码以遵循List接口提供的合同。

另一方面,如果您使用了库的核心LinkedList list = new LinkedList(),那么进行这样的更改将不会那么容易,因为无法保证您的其余代码不会使用特定于LinkedList该类的方法。

总而言之,选择只是设计问题......但这种设计非常重要(特别是在处理大型项目时),因为它可以让您在不破坏现有代码的情况下进行特定于实现的更改。


查看完整回答
反对 回复 2019-08-15
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

这称为编程接口。如果您希望将来转移到List的其他实现,这将非常有用。如果你想要一些方法,ArrayList你需要编程实现ArrayList a = new ArrayList()


查看完整回答
反对 回复 2019-08-15
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这在暴露公共接口时也很有用。如果你有这样的方法,

public ArrayList getList();

然后你决定改成它,

public LinkedList getList();

任何正在做的人ArrayList list = yourClass.getList()都需要更改他们的代码。另一方面,如果你这样做,

public List getList();

更改实施不会改变API用户的任何内容。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 1296 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号