@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. Ты прямо нарушаешь солид объявляя как сейчас.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы