在 Java 的泛型中实现 vs 扩展

Posted

技术标签:

【中文标题】在 Java 的泛型中实现 vs 扩展【英文标题】:implements vs extends in generics in Java 【发布时间】:2012-06-13 20:57:17 【问题描述】:

谁能告诉我第一个和第二个代码之间的区别是什么? MaxPQ 代表优先级队列,它是可以相互比较的“Key”对象的集合。

代码 1:

public class MaxPQ<Key extends Comparable<Key>>
...

代码 2:

public class MaxPQ<Key implements Comparable<Key>>
...

第二个代码无法编译,但我不直观为什么在使用泛型时我们需要扩展而不是实现接口。

【问题讨论】:

类似的问题可以在[这里][1]中找到。 [1]:***.com/questions/976441/… 【参考方案1】:

区别很简单:第二个代码 sn-p 不会编译,也永远不会。对于泛型,您总是对类和接口使用extendssuper 关键字也可以在那里使用,但语义不同。

【讨论】:

@MarkX:不是真的,这就是泛型的设计和指定方式。简单吗? @Mark 一个原因是:Key 本身可能是一个接口,然后即使 Comparable 是一个接口,它也会突然变成extends。因此,由于您无法在所有情况下都做到绝对正确,因此最好始终保持不一致。【参考方案2】:

泛型中没有实现。第二个代码无效。你可能会混淆:

public class MaxPQ implements Comparable<Key> 
   ...

【讨论】:

【参考方案3】:

我假设决定对接口和类都使用extends,因为在泛型类声明的情况下,类型参数绑定到接口或类没有任何区别。

当然extends 的含义与其在类定义中的典型用法完全不同。 Angelika Langer 确实有关于 Java 中 extends 不同含义的精彩文字:Does "extends" always mean "inheritance"?

【讨论】:

以上是关于在 Java 的泛型中实现 vs 扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 的泛型中使用扩展

使用多种泛型类型在 Java 中实现抽象泛型方法

Java 泛型

具有高阶函数的泛型

如何解决 Realm 对象观察器的泛型问题?

Java中的泛型数组