java - 这些类声明与 Comparable 有什么区别?

标签 java generics tree comparable generic-programming

这是一个声明

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 的两个例子:

您会注意到后者扩展了前者,但是 (sql) Date工具是 Comparablejava.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/

相关文章:

java - TreeSet 没有添加所有元素?

java - 尝试将 switch-case 与 actionlistener 一起使用

java - 使用 PHP 的 java 库打印条形码

c# - 获取通用抽象类的属性名

c# - Reflection.Emit 具有泛型类型 = 类型不是泛型

c - 如果给你两个遍历序列,你能构造二叉树吗?

c++ - 二叉树和特殊节点打印

java - 使用 Java 创建一个递归函数,打印列表中包含的所有可能的项目序列。

java - 结果集到 Excel 文件

java - 如何迭代泛型的 HashMap ?