问题 实现vs在Java中的泛型中扩展


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

代码1:

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

代码2:

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

第二个代码没有编译,但是对于我来说,为什么在使用泛型时我们需要扩展而不是实现接口是不直观的。


11622
2018-06-10 19:57


起源

类似的问题可以在[这里] [1]中找到。 [1]: stackoverflow.com/questions/976441/... - krakover


答案:


差异非常简单:第二个代码片段无法编译,永远不会。使用泛型,你总是使用 extends,对于类和接口。也 super 关键字可以在那里使用,但它有不同的语义。


11
2018-06-10 20:01



谢谢,这是有原因的吗? - Popcorn
@MarkX:不是,这就是泛型的设计和指定方式。简单? - Tomasz Nurkiewicz
@Mark一个原因是: Key 可能是一个界面本身,突然间它会 extends 尽管Comparable是一个界面。因此,在所有情况下都不能完全正确,只是始终不一致是首选。 - Voo


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

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

1
2018-06-10 20:12





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

当然意思是 extends 与它在类定义中的典型用法完全不同。 Angelika Langer确实有关于不同含义的好文本 extends 在Java中: “延伸”总是意味着“继承”吗?


0
2018-06-10 20:26