我有以下的代码初始化LinkedList:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <string.h>
typedef struct inform
{
char name[20];
char group[20];
char form[20];
int day;
int month;
int year;
int srok;
} INF_BLOK;
typedef struct list_elem
{
INF_BLOK inf;
struct list_elem *next, *prev;
} APTEKA;
APTEKA *head, *tail;
int InputData(INF_BLOK* inf);
int main()
{
return 0;
}
现在,当我想使用初始化的LinkedList时:
List<Node> optimal = new LinkedList<>();
我在IntelliJ中收到错误“无法解析方法”。现在,如果我在调用optimal.addFirst(new Node(i, p));
时让IntelliJ自动填充我的代码,我会得到以下代码:
addFirst();
我是否有理由特意将最佳列表转换为LinkedList?
我稍后尝试了以下行,运行正常,无需强制转换:
((LinkedList<Node>) optimal).addFirst(new Node(i, p));
据我记得,在使用界面而不是实现初始化时不需要任何转换,所以我在这里遗漏了什么?这可能是optimal.add(new Node(i, p));
方法特有的吗?
答案 0 :(得分:4)
addFirst
由Deque
界面提供。将optimal
定义为List
不会授予您访问该方法的权限。一种解决方案是将optimal
定义为Deque
而不是:
Deque<Node> optimal = new LinkedList<>();
答案 1 :(得分:1)
将其声明为Deque或LinkedList
Deque<Node> optimal = new LinkedList<>();
或者
LinkedList<Node> linkedlist = new LinkedList<>();
答案 2 :(得分:0)
您在此遇到的内容称为polymorphism。 LinkedList<T>
类实现接口List<T>
,因此它将具有List
interface提供的所有方法。由于您的第一行代码是
List<Node> optimal = new LinkedList<>();
它表示optimal
的类型为List,因此它只能访问List interface中定义的方法。正如您在链接页面上看到的那样,addFirst不是List的方法,它是LinkedList(或Deque接口)上的方法。
如果您想在不更改代码的情况下添加内容以开始列表,则可以使用
void add(int index, E element);
索引设置为0,
optimal.add(0, new Node(i, p));
以便将元素添加为列表的第一个元素。
回到你的问题:
我是否有理由特意将最佳列表转换为LinkedList?
是的,您将最佳定义为List。 List没有这样的方法调用addFirst。您唯一的选择是对LinkedList或Deque进行最优投射(LinkedList类实现Deque接口)