【问题标题】:Is T a class or an interface in this code?这段代码中的 T 是类还是接口?
【发布时间】:2023-03-29 22:24:01
【问题描述】:

What is <? super T> syntax?

我正在阅读这个答案,它消除了我的一些疑问,但我不明白这一行中的一件事:

T extends Comparable&lt; ? super T&gt;

回复该帖子的每个人都解释说 T 实现 Comparable&lt;T or T's superclass&gt;; 但是有写扩展,所以 T 是 Comparable 的子接口而不是子类,那么为什么所有回复都将实现作为动词?

我唯一的猜测是他们都暗示T是一个静态类型是Comparable子接口的对象,但动态类型实际上是Comparable的实现类,是这样吗?

【问题讨论】:

  • 一个类可以扩展一个类,实现一个接口。但是在定义泛型类型边界时,我们总是使用“扩展”来表示“是这种类型还是这种类型的子类型”。因此,子接口或实现该接口的类都符合条件。请参阅docs.oracle.com/javase/tutorial/java/generics/bounded.html请注意,在此上下文中,extends 用于一般意义上的“扩展”(如在类中)或“实现”(如在接口中)
  • 我确定某处有重复(我不久前看到过类似的问题),但我找不到。
  • 想一想,你会得到一个不是具体的实例化对象的T吗?它总是一个类,无论是接口的匿名实现还是实现它的类。就简单的引用而言,没有明显的T implements XYZ,因为据我记得没有太多理由进行区分。

标签: java generics interface


【解决方案1】:

事实上,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 的类(例如InstantString)相比,您不会经常使用它们。

所以人们说“T 是一个实现了Comparable 的类”只是因为它的可能性更大。

【讨论】:

    【解决方案2】:

    T可以是接口类型,也可以是普通类类型;无论哪种方式,它都“扩展”了超类型。

    特殊关键字implements 仅在声明类和列出它支持的接口时使用。 (即使在那里,Java 需要使用不同的关键字也没有真正的理由;我们可以很容易地想象一个平行宇宙,其中单个 extends 子句用于列出零个或一个超类以及零个或多个超接口,Java 会根据列出的类是接口对其进行分类。但早在引入泛型和通配符之前,这个决定就已经确定了。)

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2017-07-24
      • 2022-10-08
      • 2020-01-17
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多