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

2022-08-31 07:21:32

可能的重复:
为什么Java类的接口应该首选?

我应该何时使用

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

ArrayList继承自 ,所以如果 中的某些功能不在 中,那么我将丢失 一些功能,对吗?编译器在尝试访问这些方法时会注意到错误吗?ListArrayListListArrayList


答案 1

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

List list = new ArrayList();  

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

例如,假设您正在编写一个相当大的第三方库,并说您决定使用 .如果你的库严重依赖访问这些列表中的元素,那么最终你会发现你做出了一个糟糕的设计决策。你会意识到你应该使用一个(它给出O(1)访问时间)而不是一个(它给出O(n)访问时间)。假设您一直在编程到一个接口,那么进行这样的更改很容易。您只需更改从的实例,LinkedListArrayListLinkedListList

List list = new LinkedList();

List list = new ArrayList();  

并且您知道这将起作用,因为您已经编写了代码以遵循接口提供的合约。List

另一方面,如果您已经使用 实现了库的核心,则进行这样的更改并不容易,因为无法保证代码的其余部分不使用特定于该类的方法。LinkedList list = new LinkedList()LinkedList

总而言之,选择只是一个设计问题......但是这种设计非常重要(特别是在处理大型项目时),因为它将允许您稍后进行特定于实现的更改,而不会破坏现有代码。


答案 2

这称为编程接口。如果您希望将来迁移到 List 的其他实现,这将很有帮助。如果你想要一些方法,那么你需要编程到实现,那就是。ArrayListArrayList a = new ArrayList()