I just don't understand this.
List list = new ArrayList();
List <? extends Object> list1 = list; // unchecked conversion warning.
Since Object
is the highest upper bound in Java, I don't see any reason why the warning is there.
Update 1:
With regard to akf's answer:
I understand perfectly what you are saying. I already know that.
But <? extends Object>
is the highest upper bound. Which means you are have any type too you want. Basically <?> == <? extends Object>
.
You can try this on your code and you will see <?> == <? extends Objects>
Update 2:
With regard to Sheng's answer:
List list = new ArrayList ();
List.add("a");
List <? extends Runnable> list1 = list; //warning here
Why no warning here?
List <?> list2 = list; // No warning here
Update 3:
I'm just revisiting the above and still puzzled.
Since the following is permitted by the compiler:
List a = new ArrayList();
List <?> b = a;
List <? extends Object> c = a; // with warning of course
for (Object obj : b) {} // I don't agree with your statements above that <?> cannot be // written in the for (:) loop as shown here for (Object obj : c) {}
Both are permissible. So i still don't see why the unchecked warning when assiging raw to <? extends Object>