<>和<有什么区别?扩展了 Java 泛型中的 Object>?

2022-08-31 09:57:42

我以前见过通配符用来表示任何对象 - 但最近看到了以下用途:

<? extends Object>

由于所有对象都扩展了 Object,这两种用法是同义词吗?


答案 1

<?>并且是同义词,正如您所期望的那样。<? extends Object>

在一些泛型中,实际上并不是多余的。例如,将导致删除不足,而随之而来的将是擦除之下。(如果您尝试保留与使用 的前泛型 API 的兼容性,这可能很重要。extends Object<T extends Object & Foo>TObject<T extends Foo>FooObject

资料来源:http://download.oracle.com/javase/tutorial/extra/generics/convert.html;它解释了为什么JDK的类有一个带有这个签名的方法:java.util.Collections

public static <T extends Object & Comparable<? super T>> T max(
    Collection<? extends T> coll
)

答案 2

虽然应该是 的捷径,但两者之间有一个很小的区别。 是可再生的,而不是。他们这样做的原因是更容易区分可再生类型。任何看起来像,的东西都是不可重复的。<?><? extend object><?><? extend object><? extends something><T><Integer>

例如,此代码将起作用

List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;

但这给出了一个错误

List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;

有关更多信息,请阅读Maurice Naftalin的Java泛型和集合