I read a couple of posts such as here but I was unable to find the solution for my problem.
Why I am unable to add d? It is a subtype of Object...
Type of d: A<B<X>>
List<A<B<? extends Object>>> rv=new LinkedList<>();
rv.add(d); //not working
EDIT
I tried to simplify the problem. When I do:
A<B<?>> abcv=new A<B<String>>();
I get the error: Type mismatch: cannot convert from A<B<String>> to A<B<?>>
However, String is compatible with "?" - so why is it not working? I want to add elements to a list where the last type can by anything, something like this:
List<A<B<?>>> rv=new LinkedList<>();
rv.add(new A<B<X>>());
rv.add(new A<B<String>>());
rv.add(new A<B<Integer>>());
List<SubClaz>
is not a subtype of List<SuperClaz>
in Java. That's why the wildcards are used: List<SubClaz>
is a subtype of List<? extends SuperClaz>
.
Now for your A<B<?>> abcv=new A<B<String>>();
example:
By adding the wildcard, you're making B<String>
a subtype of B<?>
, but since these are also wrapped by another type A
, we're back to the first problem:A<B<String>>
is not a subtype of A<B<?>>
(Notice B<?>
is the SuperClaz
and B<String>
is the SubClaz
in this case).
You can fix this the same way; by adding another wildcard: A<B<String>>()
is a subtype of A<? extends B<?>>
.
Keep in mind that this doesn't allow you to read or manipulate the list as you want. Search for covariance and contravariance for more detail. Here is a good one: http://bayou.io/draft/Capturing_Wildcards.html
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