实现java接口并使用泛型

dam*_*mon 0 java generics interface

我有一个名为BST的Java接口(二进制搜索树的简称),它具有泛型类型Key,Value,其中Key扩展为Comparable.我将其定义如下.

public interface BST<Key extends Comparable<Key>,Value> {

    public void put(Key key,Value value);

    public Value get(Key key);

    public void delete(Key key);

    public Iterable<Key> keys();

}
Run Code Online (Sandbox Code Playgroud)

现在我想定义上面接口的实现.我试过这个

public class BSTImpl<Key extends Comparable<Key> ,Value>  implements BST<Key extends Comparable<Key>,Value> {

... 

}
Run Code Online (Sandbox Code Playgroud)

上面的定义在eclipse IDE中导致错误信息. extends后面的令牌implements BST<Key似乎是罪魁祸首

令牌"extends"的语法错误,预期

如果我从定义中省略"extends"标记(如下所示),则错误消失,我可以通过eclipse正确生成未实现的方法

public class BSTImpl<Key extends Comparable<Key> ,Value>  implements BST<Key ,Value> {
    @Override
    public void put(Key key, Value value) {
        // TODO Auto-generated method stub          
    }
    @Override
    public Value get(Key key) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void delete(Key key) {
        // TODO Auto-generated method stub          
    }
    @Override
    public Iterable<Key> keys() {
        // TODO Auto-generated method stub
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么扩展令牌首先会导致错误?有人可以解释一下吗?

Sot*_*lis 5

因为

public class BSTImpl<Key extends Comparable<Key> ,Value>  implements BST<Key extends Comparable<Key>,Value> {
                    ^ type declaration                                   ^ type argument
Run Code Online (Sandbox Code Playgroud)

在类声明中,泛型类型是一个类型声明,您可以稍后在类体中重用它.在您正在实现的接口中,它是一个类型参数参数.换句话说,您说我的类使用此类型实现此接口.你必须给它一个特定的类型.说Key extends Comparable...作为类型参数是没有意义的.

Java语言规格进行了详细介绍

类型参数部分在类名后面,并由尖括号分隔.

超类的部分

如果TypeDeclSpecifier后跟任何类型参数,则它必须是TypeDeclSpecifier表示的类型声明的正确调用,并且所有类型参数都不是通配符类型参数,否则会发生编译时错误.