为什么我不能直接对通用类型列表使用 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,但编译器并不确定。
我正在尝试执行 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,但编译器并不确定。