2015-09-15 4 views
1

Может кто-нибудь объяснить, почему это непроверенный литаяUnchecked литые с участием шаблонные типы

static void foo(Collection<? extends Number> collection) { 
    List<? extends Number> list = (List<? extends Number>) collection; 
} 

, но это не?

static void bar(List<? extends Number> list) { 
    Collection<? extends Number> collection = (Collection<? extends Number>) list; 
} 

Я думаю, что это как-то связано с захватами, но я хотел бы получить четкое объяснение.

Редактировать

Я понимаю, что это плохо сформулированный вопрос, и что правильный ответ «потому что List расширяет Collection». Однако в IntelliJ он генерирует предупреждение, которое обычно не получается при литье в более конкретный тип. Из комментариев ниже кажется, что это может быть просто ошибкой в ​​IntelliJ. Точное предупреждение содержится в комментариях ниже (по какой-то причине я не могу воспроизвести его здесь). Я не получаю предупреждение о любой из следующих

static void foo(Collection<Number> collection) { 
    List<Number> list = (List<Number>) collection; 
} 

static <T> void foo(Collection<T> collection) { 
    List<T> list = (List<T>) collection; 
} 

static void foo(Collection<?> collection) { 
    List<?> list = (List<?>) collection; 
} 
+2

что заставляет вас думать, что он снят? Если вы скомпилируете это с помощью '-Xlint: unchecked', вы не получите никаких предупреждений о непроверенных бросках. –

+0

А, может быть, это просто IntelliJ. Точное сообщение: 'Unchecked cast: 'java.util.Collection > 'to' java.util.List '' –

+0

И это не дает вам то же самое для трансляции из' Object' в 'String'? – RealSkeptic

ответ

0

Поскольку литая из List<? extends Number> в List<? extends Number> является подавленным и, как правило, требуют проверки типа объекта во время выполнения. Однако среда выполнения не может проверить, если параметр типа действительно является классом, который превышает Number. Эта информация недоступна во время выполнения, Java Generics («параметры типа») существуют только в статической системе типа Java, они не влияют на скомпилированный код. Таким образом, единственное, что можно сделать при проверке, которое может быть проверено во время выполнения, - это Collection - это List.

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

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