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

时间:2018-04-07 15:56:04

标签: java linked-list

我有以下的代码初始化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)); 方法特有的吗?

3 个答案:

答案 0 :(得分:4)

addFirstDeque界面提供。将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)

您在此遇到的内容称为polymorphismLinkedList<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接口)