使用 List 接口初始化 LinkedList 会在以后使用时强制转换 LinkedList



我有以下代码初始化LinkedList:

List<Node> optimal = new LinkedList<>();

现在,当我想使用初始化的 LinkedList 时:

optimal.addFirst(new Node(i, p));

我在 IntelliJ 中收到错误"无法解析方法"。现在,如果我让 IntelliJ 在调用addFirst();时自动完成我的代码,我会得到以下行:

((LinkedList<Node>) optimal).addFirst(new Node(i, p));

有没有理由我必须专门将最佳列表投射到 LinkedList?

稍后我还尝试了以下运行良好的行,无需转换:

optimal.add(new Node(i, p));

据我所知,使用接口而不是实现初始化时不需要任何强制转换,所以我在这里错过了一些东西吗?这是否可能特定于addFirst()方法?

addFirst

Deque接口提供。 将optimal定义为List不会授予您访问该方法的权限。 一种解决方案是将optimal定义为Deque

Deque<Node> optimal = new LinkedList<>();

声明它 Deque 或 LinkedList

Deque<Node> optimal = new LinkedList<>();

LinkedList<Node> linkedlist = new LinkedList<>();

你在这里遇到的称为多态性。LinkedList<T>类实现接口List<T>因此它将具有List接口提供的所有方法。由于您的第一行代码是

List<Node> optimal = new LinkedList<>();

它说optimal是List类型,因此它只能访问List接口中定义的方法。正如你在链接页面上看到的,addFirst 不是 List 的方法,它是 LinkedList(或 Deque 接口)上的方法。

如果要在不更改代码的情况下将某些内容添加到列表的开头,则可以使用

void add(int index, E element);

索引设置为 0 时,

optimal.add(0, new Node(i, p));

以便将该元素添加为列表的第一个元素。

回到您的问题:

有没有理由我必须专门将最佳列表投射到 LinkedList?

是的,您将最佳定义为列表。列表没有这样的方法调用 addFirst。你唯一的选择是将最优转换为 LinkedList 或 Deque(LinkedList 类实现接口 Deque)

最新更新