Как составить Списокк списку <Foo> - PullRequest
13 голосов
/ 15 октября 2011

Элемент ItemWriter Spring Batch's *1002* это:

write(List<? extends T> items); 

Я бы хотел, чтобы ItemWriter вызывал Сервис, но мой сервис имеет следующее:

process(List<T> items); 

AFAIK, Java Generics строго относятся к типам приведения в коллекциях.

Ответы [ 6 ]

11 голосов
/ 15 октября 2011

Просто иди и разыграй. Для чтения List<? extends Foo>, безусловно, List<Foo>, приведение абсолютно безопасно. Вы можете обернуть его Collections.unmodifiableList(), если вы параноик.

List<? extends Foo> foos1 = ...;

@SuppressWarnings("unchecked")
List<Foo> foos2 = (List<Foo>)(List<?>)foos1;    
7 голосов
/ 15 октября 2011

Убедитесь, что ваш метод получает объект, который наследуется от T, а затем выполните приведение.

Или измените сигнатуру вашего метода на равную методу записи.

3 голосов
/ 29 сентября 2015
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);

Причина, по которой list2 является представлением list1, предназначенным только для чтения, хорошо объясняется в ответе Общие сведения: список совпадает со списком?

2 голосов
/ 15 октября 2011

Если ваш сервис разрешает ? extends T, то это должен быть тип.В настоящее время говорится, что то, что было передано, должно быть точно T.

1 голос
/ 15 октября 2011

Обобщение в Java помогает вам только во время компиляции.Вы можете приводить что угодно, убедитесь, что значение можно преобразовать для нового типа.

0 голосов
/ 15 октября 2011

Разве вы не можете просто разыграть его, поскольку знаете, что если у вас есть тип, который расширяет Foo, то он является Foo?
Примерно так:

write(List<? extends Foo> items) {
    //noinspection unchecked
    process( (List<Foo>) items );
}

process(List<Foo> items) {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...