Получение слишком конкретной ошибки параметра (OCP_OVERLY_CONCRETE_PARAMETER), даже если используется объект типа списка

У меня есть метод в классе, который принимает параметр типа «Список». Когда я запускаю проверку на наличие ошибок, она возвращает ошибку ниже (слишком конкретный параметр). Хотя данный метод использует список, он жалуется на конкретный параметр. Может кто-нибудь, пожалуйста, дайте мне знать, чего мне здесь не хватает.

.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);
      ..
    }
  }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя данный метод использует список, он жалуется на конкретный параметр.

Нет, он жалуется на слишком конкретный параметр. 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);
        // ...
    }
}

Джон Боллинджер – Большое спасибо за вашу помощь.

Rob Wilkinson 03.05.2024 00:53

Другие вопросы по теме