我之前看到过使用的通配符表示任何对象 - 但最近看到了使用:
<? extends Object>
由于所有对象都扩展了Object,这两个用法是同义词吗?
答案 0 :(得分:91)
<?>
和<? extends Object>
是同义词,正如您所期望的那样。
在一些情况下,泛型extends Object
实际上并不多余。例如,<T extends Object & Foo>
会导致T
在删除时变为Object
,而<T extends Foo>
则会在删除时变为Foo
。 (如果您尝试保留与使用Object
的pre-generics API的兼容性,这可能很重要。)
来源: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
)
答案 1 :(得分:19)
虽然<?>
应该是<? 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仿制药和藏品
答案 2 :(得分:6)
<?>
是<? extends Object>
的简写。
您可以在下面阅读共享链接以获取更多详细信息。
<?>
"?"
表示任何未知类型,它可以表示代码中的任何类型。如果您不确定Type,请使用此通配符。
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
注意: <?>
表示任何事情。所以它可以接受不是从Object
类继承的Type。
<? extends Object>
<? extends Object>
表示您可以传递一个扩展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 - 用于表示类型
E - 用于表示元素
K - 键
V - 值
N - 代表数字Ref: