2015-04-14 3 views
1

У меня есть следующие определения интерфейса и класса ...Зачем мне получать предупреждение о непроверенных заданиях?

abstract interface I{} 

class Foo implements I{} 

abstract class A<T extends I> { 
    List<T> list; 
} 

class B extends A<Foo> {} 

Все определения работают отлично. Затем я хочу сделать следующее:

A b = new B(); 
List<? extends I> iList = b.list; 

компилятор действительно даст мне Unchecked Assignment предупреждение ... но почему? Не все ли из A в списках могут быть типа <? extends I>? b.list всегда имеет элементы, которые расширяют I, поэтому мне трудно понять, почему возникла ошибка

+4

'A' является [необработанным типом] (http://stackoverflow.com/q/2770321/1079354) при объявлении. – Makoto

+1

Но не все ли списки 'A' имеют тип' '? –

+0

Нет - нет гарантии безопасности типа с необработанными типами, поэтому все, что связано с дженериками, полностью отключено от таблицы. – Makoto

ответ

2

Переменная A b имеет тип сырья. Возможно, вы использовали вместо этого A<Foo> b.

+0

или 'A b = new B();' тоже будет работать –

+0

Обе хорошие исправления, но кто-нибудь видит, почему? не все ли списки 'A' имеют тип' '? –

+0

@DaiwikDaarun 'A ' не является 'A ', так как вы знаете, что общий тип более специфичен. – chrylis

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