Java 泛型和通配符

Java 泛型和通配符,java,generics,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> 类型K不是有界参数的有效替代物泛型类型参数不必命名相同,因此为了更好地看到差异,让我们重命名它们: B

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

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

类型K不是有界参数的有效替代物泛型类型参数不必命名相同,因此为了更好地看到差异,让我们重命名它们:

BST<A extends Comparable<? super A>, B>
但是,只有当
c
a
兼容时,它才起作用。我的意思是,如果
C
A
兼容

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

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

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

RectangleBST泛型类型参数不必命名相同,因此为了更好地看到差异,让我们重命名它们:

BST<A extends Comparable<? super A>, B>
但是,只有当
c
a
兼容时,它才起作用。我的意思是,如果
C
A
兼容

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

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

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

rectangleb使其成为
RectangleBST@tsolakp@shmosel。谢谢你的链接。@tsolakp确实修复了它。你能解释一下为什么我最初尝试实现它的方式有什么问题吗?(如果太麻烦的话)谢谢@安德烈亚斯作了很好的解释。我个人认为Java编译器应该能够推断
extends
定义中
K
的类型RectangleBST@tsolakp@shmosel。谢谢你的链接。@tsolakp确实修复了它。你能解释一下为什么我最初尝试实现它的方式有什么问题吗?(如果太麻烦的话)谢谢@安德烈亚斯作了很好的解释。我个人认为Java编译器应该能够推断
extends
定义中
K
的类型。我想我明白了!那么``和``之间有区别吗RectangleBST@dan第二个是无效语法。与您不能编写
矩形bst(c,d){bst(intc,intd);}
相同。类型/限制必须在声明参数的位置定义,而不是在使用参数的位置定义。我想我明白了!那么``和``之间有区别吗RectangleBST@dan第二个是无效语法。与您不能编写
矩形bst(c,d){bst(intc,intd);}
相同。类型/限制必须在声明参数的位置定义,而不是在使用参数的位置定义。
RectangleBST<C extends Comparable<? super C>, D> extends BST<C, D>
BST<K extends Comparable<? super K>, V>
RectangleBST<K extends Comparable<? super K>, V> extends BST<K, V>