Почему я не могу напрямую использовать цикл for-each для общего списка типов? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь выполнить цикл for-each, чтобы получить каждый элемент универсального типа List.

так что, если я сначала получу результат и выполню цикл для каждого, все будет хорошо.

List<MyClass<Entity>> res = response.getResponses();
MyClass<Entity> entity = res.get(0);

for(MyClass<Entity> a : res){
    System.out.println(a);
}

Но если я захочу указать цикл for-each, IDE пожалуется, что "Несовместимый класс. Обязательный объект, найден MyClass"


for(MyClass<Entity> a : response.getResponses()){
    System.out.println(a);
}

И я не могу использовать T, как предполагают некоторые посты в других местах. В среде IDE будет отображаться «Не удается разрешить символ« T »»

for(MyClass<T> a : response.getResponses()){
    System.out.println(a);
}

EDIT: Ниже приводится определение класса ответа

public class Response<T> {
    private List<MyClass<T>> responses;

    public Response(List<MyClass<T>> responses) {
        this.responses = responses;
    }

    public List<MyClass<T>> getResponses() {
        return this.responses;
    }
}

И возвращенный тип на самом деле является вызовом API, я отладил его и обнаружил, что он должен иметь тип Entity.

Есть идеи о том, почему?

1 Ответ

1 голос
/ 22 июня 2019

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

Ответ - это класс с универсальным типом.https://www.baeldung.com/java-generics

Перед прочтением этой статьи, как правило, полезно иметь java, и остальная часть этого ответа не имеет смысла без нее.

T ничего не расширяетпо умолчанию расширяет объект.Вот почему, если вы делаете ArrayList myList, это эквивалентно ArrayList<Object> myList.Если вы можете изменить Response, вы можете обновить универсальный на <T extends Entity>, и он будет работать.Это предполагает, что каждый универсальный объект T будет своего рода объектом сущности.

Проблема в том, что в какой-то момент вашей программы вы теряете специфику того, чем является этот объект, учтите это.

Response r = new Response();
List<Response<Entity>> list = r.getResponses();

Проблема с этим кодом заключается в том, что вы ожидаете ответа, но, поскольку тип не был указан, по умолчанию он равен Response<Object> r = new Response().и хотя технически он может возвращать Response изнутри, компилятор не знает этого наверняка.

...