我正在尝试进行for-each循环以获取通用类型List的每个元素。
所以如果我首先得到结果,并进行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将抱怨“类不兼容。必需的对象,找到了MyClass”
for(MyClass<Entity> a : response.getResponses()){
System.out.println(a);
}
我不能像其他地方的一些建议那样使用T。 IDE将显示“无法解析符号'T'”
for(MyClass<T> a : response.getResponses()){
System.out.println(a);
}
编辑: 以下是响应类的定义
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调用,我调试后发现它应该是实体类型。
对为什么有任何想法吗?
答案 0 :(得分:1)
在没有看到更多代码基础的情况下,我无法给出个人答案来解决该问题,但实际问题显而易见。
响应是具有通用类型的类。 https://www.baeldung.com/java-generics
在继续之前阅读该文章,在Java中拥有通常是很好的信息,而没有它,这个答案的其余部分将毫无意义。
T不会扩展任何内容,因此默认情况下会扩展Object。这就是为什么如果您进行ArrayList myList
等效于ArrayList<Object> myList
的原因。如果您可以更改响应,则可以将通用名称更新为<T extends Entity>
,它将起作用。假设每个通用对象T都是某种实体对象。
问题出在程序的某个时刻,您正在丢失有关对象是什么的细节,请考虑一下。
Response r = new Response();
List<Response<Entity>> list = r.getResponses();
该代码的问题是您期望得到响应,但是由于从未指定类型,因此默认为Response<Object> r = new Response()
。尽管从技术上讲它可能是在幕后返回Response的,但编译器并不确定这一点。