I'm having difficulty understanding wildcards in Java generics. Specifically I have the following questions:
If we have a LinkedList<?>
, why can we not add an Object
to it? I understand that it doesn't know the type of the list, but wouldn't adding an Object
to the list have us covered in any situation?
Similar to the question above, if we have LinkedList<? extends Number>
, why can we not add
a Number
to it?
Finally, if we have LinkedList<? super Number>
, why can we add
an Integer
to the list, shouldn't we only be able to add things that are a superclass of Number?
I guess I'm trying to understand how wildcards work in general, I've read the Oracle tutorials on them, and a few other things, but I don't understand why they work I suppose.
You're confusing objects and types.
Unlike simple generic parameters, wildcards describe the type of the generic parameter.
A List<? super Number>
isn't a list of superclasses of Number
; it's a list of some unknown type, where that type is a superclass of number.
A LinkedList<?>
might be a LinkedList<Car>
.
Since an Object
is not a Car
, you can't add an Object
to it.
In fact, since you don't know anything about what type the list contains, you can't add anything to it. (except null
)
Similarly, a LinkedList<? extends Number>
might be a List<Long>
, so you can't add an Integer
to it. (since an Integer
is not a Long
)
On the other hand, a List<? super Number>
is definitely allowed to contain Number
or any derived class, since it can only be a list of one of Number
's superclasses (eg, List<Object>
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With