为什么变量在 Java 中声明其接口名称?

2022-09-02 20:53:22

这是一个真正的初学者问题(我还在学习Java基础知识)。

我可以(在某种程度上)理解为什么方法会返回List<String>而不是ArrayList<String>,或者为什么它们会接受List参数而不是ArrayList。如果它对方法没有影响(即,如果不需要ArrayList中的特殊方法),这将使方法更灵活,更易于调用者使用。其他集合类型也是如此,例如 Set 或 Map。

我不明白的是:创建这样的局部变量似乎是常见的做法:

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

虽然这种形式不太常见:

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

这里的优势是什么?

我所能看到的只是一个小缺点:必须为java.util.List添加一个单独的“import”行。从技术上讲,可以使用“import java.util.*”,但我也不经常看到这种情况,可能是因为“import”行是由某些IDE自动添加的。


答案 1

当您阅读时

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

你明白你所关心的只是成为一个,你不太重视实际的实现。此外,您将自己限制为由声明的成员,而不是特定实现。您不在乎您的数据是存储在线性阵列中还是存储在一些花哨的数据结构中,只要它看起来像.List<String>List<String>List<String>

另一方面,阅读第二行可以让您想到代码关心变量是 。通过写这篇文章,你隐含地说(对未来的读者)你不应该盲目地改变实际的对象类型,因为代码的其余部分依赖于它实际上是一个.ArrayList<String>ArrayList<String>


答案 2

使用该接口,您可以快速更改 List/Map/Set/ 等的基础实现。

这不是关于保存击键,而是关于快速更改实现。理想情况下,您不应该公开实现的基础特定方法,而只使用所需的接口。