Java, наследование, методы, generics

У нас есть интерфейс сущности EntityI и его реализация Entity.

Так же имеется интерфейс SetupProviderI, у которого есть метод M1 возвращающий сущность EntityI, и реализация SetupProvider, у которого метод М1 возвращает Entity.

Все работает, что логично (мы можем использовать интерфейс в виде возвращаемой сущности и возвращать его реализации).

А теперь я создаю в интерфейсе другой метод М2, который будет возвращать List<EntityI>, но в реализации буду возвращать List<Entity>. И здесь уже у нас ошибка, не дает.

Получается мы можем вернуть интерфейс и его имплементаторов, но это касается только одного объекта, а для коллекций нам нужно использовать generics, верно?

Благодарю


Ответы (1 шт):

Автор решения: Sergey Zh.

У вас проблема с дженериками. Дело в том, что в джаве дженерики не ковариантны (в отличии, кстати, от массивов). То есть вместо List<EntityI> вы можете вернуть ArrayList<EntityI>, но вы не можете вернуть List<Entity>. Тип дженерика менять нельзя, полиморфизм работает только по коллекции (List <- ArrayList, например).

→ Ссылка