<?>和<?有什么区别? 在Javagenerics中扩展对象>

我已经看过以前使用的通配符,意思是任何对象 – 但最近看到了使用:

<? extends Object> 

由于所有的对象都是扩展对象,这两个用法是否是同义词?

<?><? extends Object> <? extends Object>是同义词,正如你所期望的,但有一些generics的情况下, extends Object实际上不是多余的。 例如, <T extends Object & Foo>将导致T成为擦除下的Object ,而<T extends Foo>将擦除后成为Foo 。 (如果您试图保留与使用Object的预genericsAPI的兼容性,这可能很重要。)

(来源: 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) 

。)

尽pipe<?>应该是<?>的快捷方式<? extend object> <? extend object> ,两者之间有一个微小的差别。 <?>可以在<? extend object> <? extend object>不是。 他们这样做的原因是为了更容易区分可定义types。 任何看起来像<? extends something> <? 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的Javagenerics和集合

<?><?>的简写 <? extends Object> 。 您可以阅读下面的共享链接了解更多详情。


 <?> 

"?" 表示任何未知的types,它可以代表任何types的代码。 如果您对“types”不确定,请使用此通配符。

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

注意: <?>意思是任何东西。 所以它可以接受没有从Object类inheritance的Type。

 <? extends Object> 

<? extends Object> <? extends Object>意味着你可以传递一个对象或扩展Object类的子类。

 ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass numberList = new ArrayList<Integer>(); //Integer extends Number numberList = new ArrayList<Float>(); // Float extends Number 

在这里输入图像描述

T – 用于表示types
E – 用来表示元素
K – 键
V值
N – 数字
参考:

在这里输入图像描述