2013-06-19 8 views
1

Может кто-нибудь объяснить мне, почему я получаю сообщение об ошибке только при создании B в следующем коде:Java общий интерфейс в коллекции

public class factory { 

    public <T> void createA(List<I<T>> c) { 
     A a = new A(c);//warning here 
    } 

    public <T> void createB(List<I<T>> c) { 
     B b = new B(c);//error here: The constructor B(List<I<T>>) is undefined 
    } 
} 

interface I<T> { 
} 


class B implements I<Integer> { 

    public B(List<I<?>> c) { 
    } 
} 

class A<T> implements I<T> { 

    public A(List<I<?>> c) { 
    } 
} 

B класса является общим и А не является, но я понятия не имею, почему это важно в таком случае.

+1

Надеюсь, вы импортировали «Список». Если нет, я думаю, что это ошибка. –

+0

Какое сообщение об ошибке вы получаете, точно? –

+0

Я пропустил импортные заявления, это не проблема. Я получаю: «Конструктор B (список >) не определен» как я писал в комментарии. –

ответ

6
public B(List<I<?>> c) { 
} 

? является unknown type. Это не дикая карта для любого другого типа. Компилятор говорит правду, нет конструктора для типа List<I<T>> (T не ?)

Это действительно не работает для другого метода тоже. Вы просто обменяли ошибку компиляции предупреждением «unchecked conversion». Поскольку класс A является parametized, вы должны были бы назвать его так:

public <T> void createA(List<I<T>> c) { 
    A<T> a = new A<T>(c); 
} 

И вуаля, поздороваться с той же ошибкой.

+0

Но тогда почему это работает? Просто добавьте это в класс B: 'static class B реализует I {' ​​Конструктор все тот же, но больше не ошибка компилятора. – darijan

+0

Итак, зачем дозировать его для класса A? –

+0

Теперь вы получаете предупреждения «непроверенного преобразования». Да, он компилируется. Но это все еще невозможно, если вы хотите избежать непроверенных преобразований. –

1

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

A a = new A(new ArrayList<String>()); 

B не является универсальным классом, так что использование B само по себе не является сырой тип, и не выключается дженерики.

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