< ?>和< 有什么区别?在java泛型中扩展object>?

wgeznvg7  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(514)

我以前见过通配符用于表示任何对象,但最近看到了:

<? extends Object>

既然所有对象都扩展了object,那么这两种用法是同义的吗?

g0czyy6m

g0czyy6m1#

<?><? extends Object> . 您可以阅读下面的共享链接了解更多详细信息。

<?>
``` `"?"` 表示任何未知类型,它可以在的代码中表示任何类型。如果不确定类型,请使用此通配符。

ArrayList<?> unknownList = new ArrayList(); //can accept of type Number
unknownList = new ArrayList(); //Float is of type Number

注: `<?>` 意味着任何事情。所以它可以接受不是从 `Object` 班级。
kuarbcqp

kuarbcqp2#

尽管 <?> 应该是一条捷径 <? 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泛型和集合

vhmi4jdf

vhmi4jdf3#

<?> 以及 <? extends Object> 是同义词,如你所料。
有一些泛型的例子 extends Object 实际上并不是多余的。例如, <T extends Object & Foo> 会引起 T 成为 Object 正在擦除,而 <T extends Foo> 它会变成 Foo 正在擦除(如果您试图保持与使用 Object .)
资料来源: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
)

相关问题