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