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