orb*_*ish 88 java generics syntax
我已经看到之前使用的通配符表示任何对象 - 但最近看到使用:
<? extends Object>
Run Code Online (Sandbox Code Playgroud)
由于所有对象都扩展了Object,这两个用法是同义词吗?
rua*_*akh 97
<?><? 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
)
Run Code Online (Sandbox Code Playgroud)
Ren*_*rde 19
虽然<?>应该是一个捷径<? extend object>,但两者之间存在微小的差别.
<?>是可以收回的,而<? extend object>不是.他们这样做的原因是为了更容易区分可再生类型.什么是像<? extends something>,<T>,<Integer>是nonreifiable.
例如,这段代码可行
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
Run Code Online (Sandbox Code Playgroud)
但这会给出错误
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息,请阅读Maurice Naftalin撰写的Java仿制药和藏品
<?>是一个简写<? extends Object>.您可以阅读以下共享链接了解更多详情.
<?>
Run Code Online (Sandbox Code Playgroud)
"?"表示任何未知类型,它可以表示代码中的任何类型.如果您不确定Type,请使用此通配符.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Run Code Online (Sandbox Code Playgroud)
注意: <?>表示任何事情.所以它可以接受不是从Object类继承的Type .
<? extends Object>
Run Code Online (Sandbox Code Playgroud)
<? 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
Run Code Online (Sandbox Code Playgroud)
T - 用于表示类型
E - 用于表示元素
K - 键
V - 值
N - 表示数字
Ref: