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成员(与数据字段分开)