Java中泛型中的implements和extends有什么区别?

15

有人能告诉我第一个和第二个代码的区别吗?MaxPQ代表优先队列,它是由可以相互比较的“键”对象组成的集合。

代码1:

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

代码 2:

public class MaxPQ<Key implements Comparable<Key>>{
...
}
第二段代码无法编译,但为什么在使用泛型时我们需要扩展而不是实现接口并不直观。

2
类似的问题可以在这里找到。 - krakover
3个回答

13

区别很明显:第二个代码片段无法编译,永远都不会。使用泛型时,你总是使用 extends,无论是类还是接口。此外,super 关键字可以在其中使用,但它具有不同的语义。


@MarkX:并不是,这就是泛型的设计和规范。简单明了? - Tomasz Nurkiewicz
4
一个原因是:Key 本身可能是一个接口,即使 Comparable 是一个接口,但 Key 可能会再次 extends。所以,由于你无法在所有情况下完全正确地做到这一点,只需保持一贯的不一致就可以了。 - Voo

1

泛型中没有实现。第二段代码是无效的。你可能和“:”混淆了。

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

0
我认为决定在接口和类中都使用 extends,是因为在泛型类声明的情况下,类型参数绑定到接口或类没有任何区别。
当然,在类定义中,extends 的含义与其典型用法非常不同。Angelika Langer 在 Java 中有一个关于 extends 不同含义的好文:Does "extends" always mean "inheritance"?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接