2010-08-22 5 views
11

Я просто не понимаю этого.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:

Я просто пересматривают выше и до сих пор недоумевают.

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

  1. List a = new ArrayList();

  2. List <?> b = a;

  3. List <? extends Object> c = a; // with warning of course

    for (Object obj : b) {} 
    // I don't agree with your statements above that &lt;?&gt; cannot be 
    
    // written in the for (:) loop as shown here 
    for (Object obj : c) {} 
    

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

+5

Разница заключается в том, что raw означает * no указанный тип * и ' '- это определение определенного ограниченного типа. Поэтому из * no type * to * some type * это непроверенное преобразование. –

+0

Тогда почему Список list2 = list; // работает. Здесь нет предупреждений. он также не присваивает тип ни одному типу (только разность между и является первой, неограниченной и последней ограниченной) – yapkm01

ответ

1

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

List<?> list = new ArrayList(); 

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

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

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

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

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

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

0

Предположим, что мы используем Runnable вместо Object в списке1. Он компилируется нормально, но ошибка времени выполнения:

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 или чем-то еще.

0

Я считаю, что это происходит из-за того, как Java обрабатывает ограниченные подстановочные знаки, в этом списке <? extends Объект > - это не то же самое, что и подкласс списка

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

+0

Вам не хватает форматирования, я думаю ... –

0

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

  1. Вы не можете просто отбрасывают контейнер «любого типа» к контейнеру «ограниченного типа» (независимо от того, если прежний ограничивается типом объекта).
  2. Всякий раз, когда вы это делаете, вы создаете «кучу загрязнение» (см Анжелики Лангер Java Дженерик Ч для описания)
2

This question, и в частности this answer, есть еще некоторые подробности о различиях между ? и ? extends Object. Я все еще не нашел ничего, что говорит, почему вы получаете предупреждение от List до List<? extends Object>.

Смежные вопросы