我有一个类Node作为DoublyLinkedNodeFibonacciNode的抽象类。

package com.benjamin;

abstract class Node<N, T extends Comparable<T>> {
    private N prev;
    private N next;
    private T data;

    public N getPrev() { return prev; }
    public N getNext() { return next; }
    public T getData() { return data; }

    public void setPrev(N prev) { this.prev = prev; }
    public void setNext(N next) { this.next = next; }
    public void setData(T data) { this.data = data; }
}


DoublyLinkedNodeFibonacciNode扩展了此类,以为这两种实现提供通用方法。

我的问题是,当我传入Java时,java似乎无法将N的类型识别为DoublyLinkedList

package com.benjamin;

public class DoublyLinkedNode<T extends Comparable<T>> extends Node<DoublyLinkedNode<T>, T>{
    DoublyLinkedNode() {
        setPrev(this);
        setNext(this);
        setData(null);
    }

    DoublyLinkedNode(T data) {
        setData(data);
    }

    @Override
    public String toString() {
        if(getData() != null) {
            return "| " + getData().toString() + " |";
        }
        else {
            return "| ; |";
        }
    }
}


在我的DoublyLinkedList类中,我收到一条错误消息,说unable to resolve method setPrev(),在许多地方,我得到了required: DoublyLinkedList got: Object

在我决定统一Node的实现之前,这段代码运行良好。

最佳答案

似乎期望使ANode.getNext()ANode.getPrev()严格返回类型为ANode的实例(而不是类型为BNodeCNode等的实例)。如果是,则将执行以下操作:

abstract class Node<N extends Node<N, T>, T extends Comparable<T>> {}

class ANode<T extends Comparable<T>> extends Node<ANode<T>, T> {}
class BNode<T extends Comparable<T>> extends Node<BNode<T>, T> {}
class CNode<T extends Comparable<T>> extends Node<CNode<T>, T> {}




但是,如this comment中指出的那样,此设计将导致以下问题:

class DNode<T extends Comparable<T>> extends ANode<T> {}
class ENode<T extends Comparable<T>> extends ANode<T> {}


在这些情况下,DNode/ENode.getNext()/getPrev()将返回ANode实例,因为父类已经设置了类型约束。

关于java - Java泛型无法识别类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51982150/

10-11 23:01
查看更多