114

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?

7
  • 2
    It's the same thing. See stackoverflow.com/questions/2274720/… Commented Nov 8, 2011 at 18:34
  • 4
    @Dan If you search "? extends Object" in that question you don't find anything. I'm reading through the answers to see if I can infer anything but I don't think this is it. Specifically, it's not talking about generics. Commented Nov 8, 2011 at 18:38
  • @Dan - That's a different question. I have seen this question before and I remember at least a mention of a subtle difference. Let me see if I can find it.. Commented Nov 8, 2011 at 18:42
  • It's also not this one if you find it: stackoverflow.com/questions/678822/… Commented Nov 8, 2011 at 18:42
  • 1
    Here we go: possible duplicate of Unbounded wildcards in Java (Featuring an incorrect answer by Kevin Bourrillion no less.) Commented Nov 8, 2011 at 18:49

3 Answers 3

122

<?> 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 ) 
Sign up to request clarification or add additional context in comments.

4 Comments

I'm unclear how the example relates? (as it uses neither <?> nor <? extends Object>)
@orbfish: It relates only in that I thought you would find it interesting, as it's an example where extends Object actually is meaningful. If I was mistaken, then I apologize. Hopefully it will be of interest to other people coming across your question, at least.
@ruakh - Was interested in bounded wildcards rather than type parameters, but, at least, you answered.
You should have stated that in your original post then. That way, his answer could have been more relevant to you.
21

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

2 Comments

How can List<?> be reifiable if compiler will translate it to List<Object> so information about what is the type of ? is lost?
What I believe <?> is more designed for backward compatible with legacy APIs. to distinguish with <Object> and <? extends Object> which are post Java 5 code.
15

<?> 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 

enter image description here

T – used to denote type
E – used to denote element
K – keys
V - values
N – for numbers
Ref:

enter image description here

2 Comments

"So It can accept of Type which are not inherited from Object class", but all Java classes are inherited or implicitly inherited from the Object class.
Objects are instances of classes, and classes are implicitly or explicitly inherited from Object. But not all types are subtypes of Object. An interface is not a subtype of Object class, while a concrete instance of that interface has a type subtype of Object.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.