Я просто не понимаю этого.Raw to <? extends Object>
List list = new ArrayList();
List <? extends Object> list1 = list; // unchecked conversion warning.
Поскольку Object
самый высокий верхний предел в Java, я не вижу никаких причин, почему предупреждение там.
Update 1:
Что касается ответа АКФ в:
Я прекрасно понимаю, что вы говорите. Я уже знаю, что. Но < ? extends Object>
- самая высокая верхняя граница. Это означает, что у вас есть любой тип, который вы хотите. В основном <?> == <? extends Object>
.
Вы можете попробовать это на свой код, и вы увидите <?> == <? extends Objects>
Update 2:
Что касается Sheng's answer:
List list = new ArrayList();
List.add("a");
List <? extends Runnable> list1 = list; //warning here
Почему нет предупреждения здесь?
List <?> list2 = list; // No warning here
Update 3:
Я просто пересматривают выше и до сих пор недоумевают.
Поскольку следующее разрешено компилятором:
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) {}
Оба допустимы. Так что я до сих пор не понимаю, почему непроверенное предупреждения при assiging сырья для <? extends Object>
Разница заключается в том, что raw означает * no указанный тип * и ' extends Object> '- это определение определенного ограниченного типа. Поэтому из * no type * to * some type * это непроверенное преобразование. –
Тогда почему Список > list2 = list; // работает. Здесь нет предупреждений. он также не присваивает тип ни одному типу (только разность между > и Extends Object> является первой, неограниченной и последней ограниченной) – yapkm01