不兼容的类型,返回静态类型的通用方法

时间:2019-01-04 02:58:17

标签: java generics

我试图实现一个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;
}

现在可以编译了。是什么原因?

2 个答案:

答案 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的边界相同。