Почему этот универсальный тип возвращаемого значения метода недопустим - PullRequest
2 голосов
/ 08 января 2012

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

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

если у меня теперь есть интерфейс, скажем, I и класс C, реализующий его, почему я не могу определить так:

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

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

Ответы [ 2 ]

10 голосов
/ 08 января 2012

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

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

public List<? extends I> get(){
    return new ArrayList<C>();
}
5 голосов
/ 08 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...