У меня есть метод в классе, который принимает параметр типа «Список». Когда я запускаю проверку на наличие ошибок, она возвращает ошибку ниже (слишком конкретный параметр). Хотя данный метод использует список, он жалуется на конкретный параметр. Может кто-нибудь, пожалуйста, дайте мне знать, чего мне здесь не хватает.
.TestClass.transform(List): 1st parameter 'dtos' could be declared as java.lang.Iterable instead
[com.TestClass] At TestClass.java:[line 146] OCP_OVERLY_CONCRETE_PARAMETER
public void transform(final List<Dto1> dtos) { //line 145
for (final Dto1 dto : dtos) { //line 146
Dto2 dto2 = convert(dto);
..
}
}
Хотя данный метод использует список, он жалуется на конкретный параметр.
Нет, он жалуется на слишком конкретный параметр. List
— это интерфейс, но способ его использования методом не зависит от того, является ли он List
, в частности. Вот что значит этот инструмент.
Может кто-нибудь, пожалуйста, дайте мне знать, чего мне здесь не хватает.
Диагностическое сообщение уже сообщает вам:
.TestClass.transform(List): 1st parameter 'dtos' could be declared as java.lang.Iterable instead
То есть объявление параметра как Iterable<Dto1>
вместо List<Dto1>
позволит принять более широкий диапазон аргументов без изменения поведения любого из тех, которые соответствуют более узкому типу.
В этом случае должно быть возможно и другое обобщение: вместо точного параметра типа для этого Iterable
вы можете использовать ограниченный подстановочный знак: Iterable<? extends Dto1>
. Это самый широкий тип параметра, который вы можете создать, который по-прежнему поддерживает все текущее поведение метода. Другими словами:
public void transform(final Iterable<? extends Dto1> dtos) {
for (final Dto1 dto : dtos) {
Dto2 dto2 = convert(dto);
// ...
}
}
Джон Боллинджер – Большое спасибо за вашу помощь.