@Mr-Governor
Губернирую

Почему не совпадает тип значения?

Всем привет. Пишу плагин для Jira, в переопределяемом override методе требуется что бы метод возвращал тип: List<IssueAction>

List и IssueAction это интерфейсы.
Я погуглил и нашел пример возвращаемого значения, он был такой:
return Lists.newArrayList(
    new GenericMessageAction("Запись 1"),
    new GenericMessageAction("Запись 2")
);


GenericMessageAction - Это класс, который реализует интерфейс IssueAction
newArrayList функция из com.google.common.collect.Lists возвращающая ArrayList который реализует интерфейс List

То есть, получается что передавая экземпляры GenericMessageAction в список, метод newArrayList мне возвращает ArrayList<GenericMessageAction>

Тогда я решил вернуть список через переменную и вернуть, вот так:
ArrayList<GenericMessageAction> list = Lists.newArrayList(
    new GenericMessageAction("Запись 1"),
    new GenericMessageAction("Запись 2")
);

return list;


Так Java не дает мне вернуть list, т.к. типы не совпадают.
Но я не понимаю почему, ведь требуется вернуть интерфейсы List<IssueAction>, я возвращаю ArrayList<GenericMessageAction>, где ArrayList реализует List а GenericMessageAction реализует IssueAction, вот и получается List<IssueAction>.

61b1c6efac6bc123748548.png

Что я делаю не так?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
Jacen11
@Jacen11
Забавно, впервые вижу как то с этим столкнулся. Это называется инвариантность, когда ArrayList{GenericMessageAction} не является потомком List{IssueAction}. Сделано так из за затирания дженериков в джаве, проблемы из за абсолютной совместимости. Если не понял о чем я, лучше читай статьи, там подробно расписано.

в твоем случае решением будет нормально объявить list. Ты прямо нарушаешь солид объявляя как сейчас.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
25 апр. 2024, в 12:20
15000 руб./за проект
25 апр. 2024, в 12:08
300 руб./за проект
25 апр. 2024, в 11:49
25000 руб./за проект