2012-01-08 3 views
2

Я не понимаю. В Java я позволил объявить интерфейс в качестве типа возвращаемого значения метода, как:Почему этот общий тип возвращаемого метода недействителен

public List<String> get(){ 
    return new ArrayList<String>(); 
} 

, если у меня теперь есть интерфейс позволяет говорить I и класс C его реализации, поэтому я не разрешено определяют следующим образом:

public List<I> get(){ 
    return new ArrayList<C>(); 
} 

Я знаю, что решение создать ArrayList<I> и добавить C к нему, но я задаюсь вопросом, почему я не позволил бы объявить его как один из приведенных выше. Я думал, что каждый C также является I, хотя это не должно быть проблемой.

ответ

10

Вы не можете сделать это, потому что List<I> и List<C> несовместимые типы.

Вы можете сделать это, однако

public List<? extends I> get(){ 
    return new ArrayList<C>(); 
} 
+0

избил меня! 1+ –

4

Вы работаете в проблему с со- и контрвариации. Короче говоря, ваш интерфейс List<I> также имеет метод Add, который ожидает экземпляр I, но не каждый I фактически будет реализован C, так как любой другой класс может также реализовать I. Поэтому вы столкнетесь с проблемами придания типов.

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