我以前见过通配符用来表示任何对象 - 但最近看到了这样的用法:
<? extends Object>
所有对象都是继承自 Object 类,那么这两种用法是否同义呢?
我以前见过通配符用来表示任何对象 - 但最近看到了这样的用法:
<? extends Object>
所有对象都是继承自 Object 类,那么这两种用法是否同义呢?
<?>
和<? extends Object>
是同义词,这一点可以预料到。extends Object
实际上并不是多余的。例如,<T extends Object & Foo>
将导致T
在擦除时变成Object
,而使用<T extends Foo>
则会在擦除时变成Foo
。(如果你试图保持与使用Object
的旧版API的兼容性,则这可能很重要。)java.util.Collections
类为什么有一个具有此签名的方法。public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
实际上有意义的例子。如果我错了,那么我道歉。希望它至少对其他遇到你问题的人有所帮助。 - ruakh尽管 <?>
被认为是 <? 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 泛型与集合》。
<?>
是<? extends Object>
的简写形式。您可以阅读下面分享的链接以了解更多详情。
<?>
?
"代表任何未知类型,它可以在代码中表示任何类型。如果您不确定类型,请使用该通配符。请注意保留HTML标签。ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
注意: <?>
表示任何东西。所以它可以接受从Object
类未继承的类型。
<? 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 - 表示数字
参考链接:
Object
类继承或隐式继承的。 - hackjutsu