我以前见过通配符用于表示任何对象,但最近看到了:
<? extends Object>
既然所有对象都扩展了object,那么这两种用法是同义的吗?
g0czyy6m1#
<?> 是 <? extends Object> . 您可以阅读下面的共享链接了解更多详细信息。
<?>
<?> ``` `"?"` 表示任何未知类型,它可以在的代码中表示任何类型。如果不确定类型,请使用此通配符。
ArrayList<?> unknownList = new ArrayList(); //can accept of type NumberunknownList = new ArrayList(); //Float is of type Number
注: `<?>` 意味着任何事情。所以它可以接受不是从 `Object` 班级。
kuarbcqp2#
尽管 <?> 应该是一条捷径 <? extend object> ,两者之间有细微的区别。 <?> 可在 <? extend object> 不是。他们这样做的原因是为了更容易区分可实现类型。任何看起来像 <? extends something> , <T> , <Integer> 是不可申报的。例如,此代码可以工作
<? 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泛型和集合
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 类具有具有此签名的方法:
extends Object
<T extends Object & Foo>
T
Object
<T extends Foo>
Foo
java.util.Collections
public static <T extends Object & Comparable<? super T>> T max( Collection<? extends T> coll )
3条答案
按热度按时间g0czyy6m1#
<?>
是<? extends Object>
. 您可以阅读下面的共享链接了解更多详细信息。ArrayList<?> unknownList = new ArrayList(); //can accept of type Number
unknownList = new ArrayList(); //Float is of type Number
kuarbcqp2#
尽管
<?>
应该是一条捷径<? extend object>
,两者之间有细微的区别。<?>
可在<? extend object>
不是。他们这样做的原因是为了更容易区分可实现类型。任何看起来像<? extends something>
,<T>
,<Integer>
是不可申报的。例如,此代码可以工作
但这是一个错误
有关更多信息,请阅读maurice naftalin的java泛型和集合
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
类具有具有此签名的方法: