Reputation: 7731
I've seen the wildcard used before to mean any object - but recently saw a use of:
<? extends Object>
Since all objects extend Object, are these two usages synonymous?
Upvotes: 114
Views: 58641
Reputation: 183251
<?>
and <? extends Object>
are synonymous, as you'd expect.
There are a few cases with generics where extends Object
is not actually redundant. For example, <T extends Object & Foo>
will cause T
to become Object
under erasure, whereas with <T extends Foo>
it will become Foo
under erasure. (This can matter if you're trying to retain compatibility with a pre-generics API that used Object
.)
Source: http://download.oracle.com/javase/tutorial/extra/generics/convert.html; it explains why the JDK's java.util.Collections
class has a method with this signature:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
Upvotes: 121
Reputation: 8232
<?>
is a shorthand for <? extends Object>
.
You may read below shared link for more details.
<?>
"?"
denotes any unknown type, It can represent any Type at in code for. Use this wildcard if you are not sure about Type.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Note: <?>
means anythings. So It can accept of Type which are not inherited from Object
class.
<? extends Object>
<? extends Object>
means you can pass an Object or a sub-class that extends Object
class.
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 – used to denote type
E – used to denote element
K – keys
V - values
N – for numbers
Ref:
Upvotes: 15
Reputation: 556
Although <?>
is supposed to be a shortcut for <? extend object>
, there is a tiny difference between the two.
<?>
is reifiable while <? extend object>
is not. The reason they did this is to make it easier to distinguish reifiable type. Anything that looks like <? extends something>
,<T>
,<Integer>
are nonreifiable.
For example, this code would work
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
but this gives an error
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
for more info read Java generics and collections by Maurice Naftalin
Upvotes: 21