这是一个声明
public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> {
....
}
这是另一个声明
public class BinarySearchTree<AnyType extends Comparable<AnyType>>{
.....
}
我知道第一个声明是首选(在很多 Java 示例和教科书中都看到过)但为什么呢?当我也尝试使用第二个声明时,我的所有代码都运行良好。
我知道 super 在这种情况下使用, ? super AnyType,表示 AnyType 或其任何父类(super class)。 Super
对我来说,他们都在说 BinarySearchTree 这个类支持任何可比较的对象类型。任何人都可以描述或举例说明这种微妙的差异实际上在哪里产生影响吗?
以狗为例
class Animal implements Comparable<Animal>
class Dog extends Animal
public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> {
...}
Would allow for
BinarySearchTree<Dog> but
public class BinarySearchTree<AnyType extends Comparable<AnyType>>{
.....
} wouldn't
最佳答案
Can anyone describe or give an example of where this subtle difference actually makes a difference?
是的。来自 JDK 的两个例子:
- >
java.util.Date
; - >
java.sql.Date
.
您会注意到后者扩展了前者,但是 (sql) Date
工具是 Comparable
的 java.util.Date
.
如果它“仅”实现 Comparable
就其本身而言,您无法将其与“正常”Date
进行比较.
同时考虑 Consumer
的简单情况(Java 8 中出现的接口(interface))。使用频率最高的Consumer
全部是System.out::println
;它的参数是一个 Object
在这种情况下。
现在,如果 Stream
的签名的 .forEach()
是.forEach(Consumer<T> consumer)
而不是 .forEach(Consumer<? super T>)
,除了 Stream<Object>
之外,您根本无法使用该“通用消费者” !
这是 PECS 规则的 CS 部分(Producer Extends,Consumer Super)。
关于java - 这些类声明与 Comparable 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650801/