我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法:
<? extends Object>
由于所有对象都扩展了对象,所以这两种用法是同义词吗?
我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法:
<? extends Object>
由于所有对象都扩展了对象,所以这两种用法是同义词吗?
Answers:
<?>并且<? extends Object>是同义的,正如你所期望的。
在某些情况下,泛型extends Object实际上并不是多余的。例如,<T extends Object & Foo>将导致T成为Object下删除,而与<T extends Foo>它会成为Foo下删除。(如果您要保留与使用的前泛型API的兼容性,这可能很重要Object。)
来源: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
)
extends Object实际上是有意义的。如果我弄错了,那我道歉。希望至少其他人对您的问题感兴趣。
虽然<?>应该是的捷径<? extend object>,但两者之间的差别很小。
<?>是可辩护的,而<? extend object>不是。他们这样做的原因是为了更容易区分可确定类型。什么是像<? extends something>,<T>,<Integer>是nonreifiable。
例如,此代码将起作用
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
但这给出了一个错误
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
有关更多信息,请阅读Maurice Naftalin的Java泛型和集合。
<?>是的简写<? 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类的子类。
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:
Object该类继承或隐式继承的。