<?>和<?有什么区别? 在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 – 数字
参考: