我正在阅读此答案,这使我消除了一些疑问,但我对此行一无所知:
T extends Comparable< ? super T>
该帖子回复中的每个人都解释说T 实现 Comparable<T or T's superclass>
;但是有书面的扩展,所以T是Comparable的子接口,而不是子类,那么为什么所有的回复都将实现作为动词?
[我唯一的猜测是,他们都暗示T是一个对象,其静态类型是Comparable的子接口,但是动态类型实际上是可比较的实现类,是吗?
T
可以是接口类型或常规类类型;无论哪种方式,它都会“扩展”超类型。
特殊关键字implements
仅在声明类并列出其支持的接口时使用。 (即使在那里,也没有真正的理由让Java needs使用不同的关键字;我们可以轻松地想象一个并行的Universe,其中单个extends
子句用于列出零个或一个超类以及零个或多个超接口,并且Java根据列出的类是接口对它进行分类,但是这个决定早在引入泛型和通配符之前就已经确定了。)
事实是,T
可以是实现Comparable
的类,或 Comparable
的子接口。通用约束语法中使用的单词extends
与类继承子句中的单词extends
含义不同。
下面的代码演示了两种情况:
interface Foo {}
interface Bar extends Foo {}
class Baz implements Foo {}
public static <T extends Foo> void f(T t) {
}
Bar bar = new Bar() {};
f(bar); // compiles!
Baz baz = new Baz();
f(baz); // compiles!
但是,作为实现T
的类的Comparable
比作为Comparable
的子接口的可能性要大得多。 JDK中Comparable
的唯一子接口是:
ChronoLocalDate, ChronoLocalDateTime<D>, Chronology, ChronoZonedDateTime<D>, Delayed, Name, Path, RunnableScheduledFuture<V>, ScheduledFuture<V>
[与实现Comparable
的类,例如Instant
和String
相比,您不会经常使用。