我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法:
<? 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
该类继承或隐式继承的。