Как привести дженерики в цикл? - PullRequest
4 голосов
/ 21 января 2011
public static void someMethod(List < ? extends BaseDto > list) {
    for (ChildDto dto : list) {

    }
}

ChildDto расширяет BaseDto, и здесь я уверен, что список, полный ChildDto.

Я знаю, что могу сделать что-то подобное

for (TextApplicationDto dto : (List<TextApplicationDto>)list) {

но выглядит не очень красиво.

Есть ли лучший способ сделать кастинг?

Ответы [ 2 ]

8 голосов
/ 21 января 2011

Я думаю, что лучший способ будет:

public static void someMethod(List < ? extends BaseDto > list) {
    for (BaseDto dto : list) {
        ChildDto taDTO = (ChildDto)dto;
        // Whatever
    }
}

Это также позволяет использовать instanceof, чтобы быть уверенным, что список содержит только ChildDto

3 голосов
/ 21 января 2011

ChildDto расширяет BaseDto, и здесь я уверен, что список, полный ChildDto.

Тогда почему тип аргумента этого метода не соответствуетзнание?

Это должно быть List<ChildDto> или даже List<? extends ChildDto>.

То, как вы разыгрываете это одно решение, вы также можете разыграть каждое возвращаемое значение самостоятельно.Оба одинаково хороши тем, что потерпят неудачу примерно в одной и той же позиции:

for (BaseDto bDto : list) 7
  ChildDto dto = (ChildDto) bDto;
  // ...
}
...