<! - ? - >和<! - 之间有什么区别?在Java泛型中扩展Object - >?

时间:2011-11-08 18:33:15

标签: java syntax generics

我之前看到过使用的通配符表示任何对象 - 但最近看到了使用:

<? extends Object>

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

3 个答案:

答案 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 

enter image description here

T - 用于表示类型
E - 用于表示元素
K - 键
V - 值
N - 代表数字Ref:

enter image description here

相关问题