Java 为什么我不能分配给这个泛型变量?

Java 为什么我不能分配给这个泛型变量?,java,generics,inner-classes,nested-generics,Java,Generics,Inner Classes,Nested Generics,我正在尝试实现一个树,以便节点是通用的: public class BinarySearchTree<U extends BinarySearchTree.Node, T extends Comparable<? super T>> { public U root; ... public class Node { T data; U left; U right; public N

我正在尝试实现一个树,以便节点是通用的:

public class BinarySearchTree<U extends BinarySearchTree.Node, T extends Comparable<? super T>> 
{
    public U root;
    ...

    public class Node {
        T data;
        U left;
        U right;

        public Node(T data) {
            this.data = data;
            left = null;
            right = null;
        }
    }
}

您应该将类定义重写为

public class BinarySearchTree<U extends BinarySearchTree<U, T>.Node, T extends Comparable<? super T>>

公共类BinarySearchTree由于
节点
不是静态的,因此每个
节点
实例都属于一个包含
BinarySearchTree
的实例。但泛型不可能指定它属于哪一个。因此,如果指定
BinarySearchTree.Node
,它可以属于任何
BinarySearchTree
。因为您还使用了原始类型(不要忽略警告!),所以不知道
U
是什么。因此,Java无法检查
root.left
root.right
是否属于同一类型,这就是为什么会出现错误

您可以通过如下指定类来修复编译错误:

class BinarySearchTree<U extends BinarySearchTree<U,T>.Node, T extends Comparable<? super T>> 
{ ... }
public class BinarySearchTree<T extends Comparable<? super T>>
{
    private Node<T> root;

    private static class Node<T> 
    {
        T data;
        Node<T> left;
        Node<T> right;
    }

    ...
}
但是我首先质疑是否需要一个泛型节点类。通常,此类节点被视为一个实现细节,您希望能够完全控制从类中创建它们。这不能与泛型节点一起使用,因为您的类不知道实例化哪种类型的节点

因此,我将您的
BinarySearchTree
类定义如下:

class BinarySearchTree<U extends BinarySearchTree<U,T>.Node, T extends Comparable<? super T>> 
{ ... }
public class BinarySearchTree<T extends Comparable<? super T>>
{
    private Node<T> root;

    private static class Node<T> 
    {
        T data;
        Node<T> left;
        Node<T> right;
    }

    ...
}

公共类BinarySearchTree显示方法的位置是什么?原因是我需要对BinarySearchTree类进行子类化,并向其节点添加一个int成员(与数据字段分开)