必需的类型t,提供的对象

dl5txlt9  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(291)

我尝试实现通用链表,但出现错误:
必需的类型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;

    }

}

有什么问题吗?

bvjveswy

bvjveswy1#

导致此错误的原因是您重新声明了类型 TremoveFromHead() ; T 已在类声明中声明,因此编译器尝试将两种不同类型的相同名称等同起来。
将方法重新声明为: protected T removeFromHead() 这个错误应该会消失(在另一个类方法中也有同样的问题。)
正如评论者所指出的,您还遗漏了type参数 T 关闭所有出现的 ListElementListElement ,将生成单独的警告。

eit6fx6z

eit6fx6z2#

更改以下行

private ListElement<T> head;
private ListElement<T> tail;
qvtsj1bj

qvtsj1bj3#

让我们看看您的代码(以及我建议的关于泛型的更改):

public class DDLinkedList<T> {
    private ListElement<T> head;
    private ListElement<T> tail;

给,你想要什么 head 以及 tail 具体来说 ListElement s包含 T 价值,而不仅仅是任何原料 ListElement . 那是什么 ListElement<T> 快件。

protected void addToHead(T val){

不要使用 protected <T> void addToHead(T val){ ,作为 <T> 引入了一个新的变量类型,顺便说一下,也称为 T ,但与预期的列表元素类型无关 T .

if (this.isEmpty()){
            head = new ListElement<T>(val, head, null);

您需要声明您创建了一个 ListElement 元素类型 T . (您的版本肯定会在使用原始类型时发出警告。)并且没有双参数构造函数 ListElement .

tail = head;
        }else {
            head = new ListElement<T>(val, head, null);
            head.next.prev  = head;
        }
    }

    protected T removeFromHead(){
        if(this.isEmpty()){
            return null;
        }
        T val = head.val;

由于宣布 private ListElement<T> head; ,编译器现在知道 head.val 属于类型 T ```
head = head.next;
return val;
}
}

public static class ListElement {
private ListElement next;
private ListElement prev;

在元素类型为的列表中 `T` ,的 `next` 以及
prev `ListElement` s肯定也会包含 `T` .

private T val;

public ListElement(){
    this(null, null, null);
}

public ListElement(T val){
    this(val, null, null);
}

public ListElement(T val, ListElement<T> next, ListElement<T> prev){
    this.val = val;
    this.next = next;
    this.prev = prev;

}

}

然后,有一个问题,你有私人领域 `ListElement` ,但从外部访问它们。一个解决方案是保持字段私有,为字段引入getter和setter,并使用getter和setter而不是直接的字段访问。或者更好的是,将链接逻辑移到 `ListElement` 同学们,所以你们根本不需要二传手。

相关问题