我有以下代码初始化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)