Элемент ItemWriter Spring Batch's *1002* это:
write(List<? extends T> items);
Я бы хотел, чтобы ItemWriter вызывал Сервис, но мой сервис имеет следующее:
process(List<T> items);
AFAIK, Java Generics строго относятся к типам приведения в коллекциях.
Просто иди и разыграй. Для чтения List<? extends Foo>, безусловно, List<Foo>, приведение абсолютно безопасно. Вы можете обернуть его Collections.unmodifiableList(), если вы параноик.
List<? extends Foo>
List<Foo>
Collections.unmodifiableList()
List<? extends Foo> foos1 = ...; @SuppressWarnings("unchecked") List<Foo> foos2 = (List<Foo>)(List<?>)foos1;
Убедитесь, что ваш метод получает объект, который наследуется от T, а затем выполните приведение.
Или измените сигнатуру вашего метода на равную методу записи.
List<? extends Foo> list1 = ... List<Foo> list2 = Collections.unmodifiableList(list1);
Причина, по которой list2 является представлением list1, предназначенным только для чтения, хорошо объясняется в ответе Общие сведения: список совпадает со списком?
list2
list1
Если ваш сервис разрешает ? extends T, то это должен быть тип.В настоящее время говорится, что то, что было передано, должно быть точно T.
? extends T
T
Обобщение в Java помогает вам только во время компиляции.Вы можете приводить что угодно, убедитесь, что значение можно преобразовать для нового типа.
Разве вы не можете просто разыграть его, поскольку знаете, что если у вас есть тип, который расширяет Foo, то он является Foo? Примерно так:
Foo
write(List<? extends Foo> items) { //noinspection unchecked process( (List<Foo>) items ); } process(List<Foo> items) { // ... }