Raw to

Я просто не понимаю этого.

List list = new ArrayList();
List  list1 = list; // unchecked conversion warning.

Поскольку Object является самой высокой верхней границей в Java, я не понимаю Я не вижу причин, по которым есть предупреждение.

Обновление 1:

Что касается ответа Акфа:

Я прекрасно понимаю, что вы говорите. Я уже знаю, что. Но ? extends Object> - верхняя верхняя граница. Что означает, что у вас есть любой тип, который вы хотите. В основном > == extends Object> .

Вы можете попробовать это в своем коде, и вы увидите > == расширяет Объекты>

Обновление 2:

Что касается ответа Шэна :

List  list = new ArrayList ();
List.add("a");
List  list1 = list; //warning here

Почему здесь нет предупреждения?

List  list2 = list; // No warning here

Обновление 3:

Я просто возвращаюсь к вышесказанному и все еще озадачен.

Поскольку компилятором разрешено следующее:

  1. List a = new ArrayList ();

  2. List > b = a;

  3. Список расширяет объект> c = a; // с предупреждением о курсе

     for (Object obj: b) {}
    // Я не согласен с вашими утверждениями выше, что & lt;? & Gt; не может быть
    
    // записано в цикле for (:), как показано здесь
    for (Объект obj: c) {}
    

Оба допустимы. Так что я до сих пор не понимаю, почему непроверенное предупреждение при присвоении raw для extends Object>

11
задан Community 23 May 2017 в 12:04
поделиться

5 ответов

Я считаю, что это происходит из-за того, как Java обрабатывает ограниченные подстановочные знаки в этом списке не то же самое и не подкласс List

. Первоначально концепция несколько сбивала меня с толку, и я обнаружил, что документ Generics in the Java Programming Language чрезвычайно полезен для понимания именно этих типов Generics .

0
ответ дан 3 December 2019 в 12:04
поделиться

Этот вопрос и, в частности, этот ответ , содержат более подробную информацию о различиях между ? и ? расширяет Объект . Я до сих пор не нашел ничего, что говорило бы, почему вы получаете предупреждение о назначении из List в List .

2
ответ дан 3 December 2019 в 12:04
поделиться

Предположим, если мы используем 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 , независимо от того, является ли SomeType Object или чем-то еще.

0
ответ дан 3 December 2019 в 12:04
поделиться

Если я правильно понимаю, то по умолчанию компилятор предполагает, что вы имеете в виду это

List<?> list = new ArrayList();

? означает, что у вас может быть любой общий тип, который вы хотите. Вот почему

List list = new ArrayList();
List <?> list2 = list

работает, потому что для компилятора это одно и то же

Однако, когда вы делаете это

List<?> list = new ArrayList();
List<? extends Object> list2 = list

, вы ограничиваете его объем. Поскольку вы ограничиваете объем, вы получаете предупреждение. Да, я знаю, что вы так не думаете, но для компилятора вы им являетесь. Если вы абсолютно уверены, что знаете, что делаете, просто игнорируйте это или подавляйте

1
ответ дан 3 December 2019 в 12:04
поделиться

Я думаю, что Шэнъюань Лу уже объяснил это точно. Я бы добавил, что всякий раз, когда вы видите такую ​​вещь, просто вспомните эти два следующих момента:

  1. Вы не можете просто преобразовать контейнер «любого типа» в контейнер «ограниченного типа» (независимо от того, является ли первый ограниченным к типу объекта).
  2. Всякий раз, когда вы это делаете, вы создаете «загрязнение кучи» (см. Описание в FAQ по Java Generics Анжелики Лангер)
0
ответ дан 3 December 2019 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: