泛型和通配符

时间:2019-02-11 23:33:41

标签: java generics

我正在设计BinarySearchTree的实现,尽管遇到了我从未遇到过的问题。我对如何解决这个问题也不太了解:

The type K is not a valid substitute for the bounded parameter <K extends Comparable<? super K>> of the type BST<K,V>

这是在创建名为BST<K extends Comparable<? super K>, V>的抽象类,然后又扩展了名为RectangleBST<K,V>的另一个类后遇到的错误。所以RectangleBST<K,V> extends BST<K,V>,但是当我使用BST<K, V>时,我得到了错误。

一种解决方案是使用扩展BST<Integer, Rectangle>,但这是否意味着我现在继承了专门用于Integer键类型和Value of Rectangle类型方法?

另一种可能是在RectangleBST中具有可比性,尽管我认为我的计划是比较BST中的键而不是RectangleBST?

1 个答案:

答案 0 :(得分:2)

通用类型参数不必命名相同,因此为了更好地了解它们之间的区别,让我们重命名它们:

BST<A extends Comparable<? super A>, B>
RectangleBST<C, D> extends BST<C, D>

工作原理类似于函数调用:

bst(int a, int b)
rectangleBst(int c, int d) {
    bst(c, d);
}

但是,它仅在ca兼容的情况下有效。我的意思是,如果CA兼容。

不是这样,因为C可以是任何类型,甚至是没有实现/扩展Comparable的类型。由于A需要type参数来实现/扩展Comparable,因此C不兼容。

要使其兼容,还需要将C限制为实现/扩展Comparable的类型:

RectangleBST<C extends Comparable<? super C>, D> extends BST<C, D>

现在CA兼容。


好吧,现在使用您想要的名称:

BST<K extends Comparable<? super K>, V>
RectangleBST<K extends Comparable<? super K>, V> extends BST<K, V>

请记住,K中的RectangleBSTK中的K不是相同 BST。是与K映射到K中的BST的{​​{1}}不同,与C被映射到A一样。