我尝试实现通用链表,但出现错误:
必需的类型t,行t val=head.val中提供的对象;
ddlinkedlist类:
public class DDLinkedList <T>{
private ListElement head;
private ListElement tail;
protected <T> void addToHead(T val){
if (this.isEmpty()){
head = new ListElement(val,head);
tail = head;
}else {
head = new ListElement(val, head);
head.next.prev = head;
}
}
protected <T> T removeFromHead(){
if(this.isEmpty()){
return null;
}
T val = head.val;
head = head.next;
return val;
}
}
列表元素类:
public static class ListElement<T> {
private ListElement next;
private ListElement prev;
private T val;
public ListElement(){
this(null, null, null);
}
public ListElement(T val){
this(val, null, null);
}
public ListElement(T val, ListElement next, ListElement prev){
this.val = val;
this.next = next;
this.prev = prev;
}
}
有什么问题吗?
3条答案
按热度按时间bvjveswy1#
导致此错误的原因是您重新声明了类型
T
在removeFromHead()
;T
已在类声明中声明,因此编译器尝试将两种不同类型的相同名称等同起来。将方法重新声明为:
protected T removeFromHead()
这个错误应该会消失(在另一个类方法中也有同样的问题。)正如评论者所指出的,您还遗漏了type参数
T
关闭所有出现的ListElement
在ListElement
,将生成单独的警告。eit6fx6z2#
更改以下行
qvtsj1bj3#
让我们看看您的代码(以及我建议的关于泛型的更改):
给,你想要什么
head
以及tail
具体来说ListElement
s包含T
价值,而不仅仅是任何原料ListElement
. 那是什么ListElement<T>
快件。不要使用
protected <T> void addToHead(T val){
,作为<T>
引入了一个新的变量类型,顺便说一下,也称为T
,但与预期的列表元素类型无关T
.您需要声明您创建了一个
ListElement
元素类型T
. (您的版本肯定会在使用原始类型时发出警告。)并且没有双参数构造函数ListElement
.由于宣布
private ListElement<T> head;
,编译器现在知道head.val
属于类型T
```head = head.next;
return val;
}
}
public static class ListElement {
private ListElement next;
private ListElement prev;
private T val;
}