Может кто-нибудь объяснить, почему это непроверенный литая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;
}
что заставляет вас думать, что он снят? Если вы скомпилируете это с помощью '-Xlint: unchecked', вы не получите никаких предупреждений о непроверенных бросках. –
А, может быть, это просто IntelliJ. Точное сообщение: 'Unchecked cast: 'java.util.Collection> 'to' java.util.List extends java.lang.Number> '' –
И это не дает вам то же самое для трансляции из' Object' в 'String'? – RealSkeptic