我试图实现一个BST类,就像
class BST<T> {
private Node<T> root;
private static class Node<T> {
T element;
Node<T> left;
Node<T> right;
}
}
我想使用以Node作为参数并返回后继节点的方法来获取后继节点
private <T> Node<T> get(Node<T> current node){
Node<T> successor = root;
}
在这里,我得到了不兼容的类型。如果我删除方法绑定
private Node<T> get(Node<T> current node) {
Node<T> successor = root;
}
现在可以编译了。是什么原因?
答案 0 :(得分:1)
原因T已在类级别BST<T>
中定义。这意味着您必须使用BST<String>.method();
,如果您从<T>
中删除了BST
,则必须在方法级别指定类型,并且需要添加<T>
在您的方法声明中。调用方法为BST.method<String>();
答案 1 :(得分:0)
您当前的代码(未编译)为:
static class BST<T> {
private Node<T> root;
private static class Node<T> {
T element;
Node<T> left;
Node<T> right;
}
//
private <S> Node<T> get(Node<T> currentNode) {
Node<S> successor = root;
return null;
}
}
现在您可以通过Node<S>
轻松地与Node<T>
不兼容,对吧?
由于存在方法绑定,因此在这种情况下,编译器将方法绑定和successor
绑定视为相同。但是,类BST<T>
中表示的 bound与<T> Node<T> get
方法中表示的bound 还是不相同,这就是不兼容的原因。
如果您希望使用相同的绑定,则只需更改上面的代码即可摆脱方法绑定,在该方法中看不到任何编译错误。此后,就推断出successor
的边界与类BST
的边界相同。