为什么我不能直接对通用类型列表使用 for-each 循环?

Why I cannot directly use for-each loop for generic type list?

我正在尝试执行 for-each 循环以获取通用类型列表的每个元素。

所以如果我先得到结果,然后做 for-each 循环,就没问题了。

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

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

但是如果我想引导 for-each 循环,IDE 会抱怨 "Incompatible class. Required Object, Found MyClass"


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

而且我不能像其他地方的一些帖子所建议的那样使用 T。 IDE 会显示 "Cannot resolve symbol 'T'"

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

编辑: 以下是响应 class 定义

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类型

知道为什么吗?

如果没有看到更多您的代码库,我无法给出解决问题的个人答案,但实际问题很明显。

响应是具有通用类型的 class。 https://www.baeldung.com/java-generics

在继续之前阅读那篇文章,java 中包含的信息通常是很好的信息,没有它,这个答案的其余部分将毫无意义。

T 不扩展任何东西,所以默认情况下它扩展了 Object。这就是为什么如果你做 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,但编译器并不确定。