Java, наследование, методы, generics
У нас есть интерфейс сущности EntityI и его реализация Entity.
Так же имеется интерфейс SetupProviderI, у которого есть метод M1 возвращающий сущность EntityI, и реализация SetupProvider, у которого метод М1 возвращает Entity.
Все работает, что логично (мы можем использовать интерфейс в виде возвращаемой сущности и возвращать его реализации).
А теперь я создаю в интерфейсе другой метод М2, который будет возвращать List<EntityI>, но в реализации буду возвращать List<Entity>. И здесь уже у нас ошибка, не дает.
Получается мы можем вернуть интерфейс и его имплементаторов, но это касается только одного объекта, а для коллекций нам нужно использовать generics, верно?
Благодарю
Ответы (1 шт):
У вас проблема с дженериками. Дело в том, что в джаве дженерики не ковариантны (в отличии, кстати, от массивов).
То есть вместо List<EntityI> вы можете вернуть ArrayList<EntityI>, но вы не можете вернуть List<Entity>. Тип дженерика менять нельзя, полиморфизм работает только по коллекции (List <- ArrayList, например).