обо всем по порядку.
- Я могу передать только List.class или Map.class вместо того, чтобы указывать
универсальный тип. На основании этого определяется тип результата
(детали реализации не предоставлены).
Вы не можете указать универсальный тип в параметре класса, потому что (Прочтите это внимательно) Информация универсального типа не присутствует во время выполнения. Во время выполнения вы не получаете List<String>
или List<Integer>
и т. Д. Во время выполнения все просто List
.
Краткая история о том, почему это так.
Обобщения не существовали до Java 5. Поэтому, когда дженерики были представлены как часть Java 5, последнее, что они хотели сделать, - это сказать всему миру, чтобы они изменились с List
на List<String>
или List<Whatever_Object_They_Want>
,
Например, , скажем, вы используете зависимость, которая была скомпилирована с использованием Java 4, и метод в этой зависимости, который возвращает просто старый List
, вы все равно можете вызвать этот метод, используя свой код , который скомпилирован в Java 5. Единственное, что вы не можете привести его к какому-либо универсальному типу.
Представьте себе, если Java5 начал поддерживать только общие типы, такие как List <>, а не обычный старый List. Вы должны зависеть от всех поставщиков, чтобы обеспечить зависимость, которая скомпилирована в Java5. Это вызвало бы хаос. Таким образом, чтобы избежать этого и поддерживать обратную совместимость с теми, кто использовал предыдущие версии java, информация об общем типе удаляется, когда код компилируется в байтовый код. Это называется Type Erasure
.
По этой причине нельзя указывать универсальный тип с литералами класса любого типа коллекции.
Подойдя ко второму пункту
- Поскольку тип результата получен с использованием литерала класса, я получаю следующие ошибки времени компиляции.
Несоответствие типов: невозможно преобразовать из List<Set<String>>
в List<T>
Несоответствие типов: невозможно преобразовать из List<Map<String,Object>>
в List<T>
При просмотре документации Generics универсальный тип List
отличается от List< Map< String, Object >>>
. (Вот почему у нас есть дженерики в Java. Например, List<String>
отличается от List<Object>
. Вы не можете привести List<String>
к List<Object>
)
Однако, так как вы хотите вернуть List<Map<>>
в некоторых случаях и List<Set<>>
в некоторых других случаях в зависимости от параметра, я предлагаю вам изменить тип возврата метода serve
на List<? extends Collection>
Использование List<? extends Collection>
в качестве аргумента возвращаемого типа / метода означает, что этот список может быть списком любого из подклассов Collection. Пожалуйста, взгляните на иерархию, чтобы получить больше информации.
Надеюсь, это помогло!