Я просто не понимаю этого.
List list = new ArrayList();
List extends Object> list1 = list; // unchecked conversion warning.
Поскольку Object
является самой высокой верхней границей в Java, я не понимаю Я не вижу причин, по которым есть предупреждение.
Обновление 1:
Что касается ответа Акфа:
Я прекрасно понимаю, что вы говорите. Я уже знаю, что.
Но ? extends Object> - верхняя верхняя граница. Что означает, что у вас есть любой тип, который вы хотите. В основном > == extends Object>
.
Вы можете попробовать это в своем коде, и вы увидите > == расширяет Объекты>
Обновление 2:
Что касается ответа Шэна :
List list = new ArrayList ();
List.add("a");
List extends Runnable> list1 = list; //warning here
Почему здесь нет предупреждения?
List > list2 = list; // No warning here
Обновление 3:
Я просто возвращаюсь к вышесказанному и все еще озадачен.
Поскольку компилятором разрешено следующее:
List a = new ArrayList ();
List > b = a;
Список расширяет объект> c = a; // с предупреждением о курсе
for (Object obj: b) {}
// Я не согласен с вашими утверждениями выше, что & lt;? & Gt; не может быть
// записано в цикле for (:), как показано здесь
for (Объект obj: c) {}
Оба допустимы. Так что я до сих пор не понимаю, почему непроверенное предупреждение при присвоении raw для extends Object>
Я считаю, что это происходит из-за того, как Java обрабатывает ограниченные подстановочные знаки в этом списке extends Object> не то же самое и не подкласс List
. Первоначально концепция несколько сбивала меня с толку, и я обнаружил, что документ Generics in the Java Programming Language чрезвычайно полезен для понимания именно этих типов Generics .
Этот вопрос и, в частности, этот ответ , содержат более подробную информацию о различиях между ?
и ? расширяет Объект
. Я до сих пор не нашел ничего, что говорило бы, почему вы получаете предупреждение о назначении из List
в List тем не менее, расширяет Object>
.
Предположим, если мы используем Runnable
вместо Object
в list1. Это компилируется нормально, но во время выполнения возникает ошибка:
List list = new ArrayList ();
list.add("a");
List <? extends Runnable> list1 = list;
for(Runnable o:list1){ //Runtime exception-> java.lang.ClassCastException
o.run();
}
Этот пример показывает потенциальную проблему, поэтому здесь и предупреждение.
Но ваша IDE просто проверяет синтаксис List extends SomeType>
, независимо от того, является ли SomeType Object
или чем-то еще.
Если я правильно понимаю, то по умолчанию компилятор предполагает, что вы имеете в виду это
List<?> list = new ArrayList();
? означает, что у вас может быть любой общий тип, который вы хотите. Вот почему
List list = new ArrayList();
List <?> list2 = list
работает, потому что для компилятора это одно и то же
Однако, когда вы делаете это
List<?> list = new ArrayList();
List<? extends Object> list2 = list
, вы ограничиваете его объем. Поскольку вы ограничиваете объем, вы получаете предупреждение. Да, я знаю, что вы так не думаете, но для компилятора вы им являетесь. Если вы абсолютно уверены, что знаете, что делаете, просто игнорируйте это или подавляйте
Я думаю, что Шэнъюань Лу уже объяснил это точно. Я бы добавил, что всякий раз, когда вы видите такую вещь, просто вспомните эти два следующих момента: