为什么我不能直接将for-each循环用于泛型类型列表?

时间:2019-06-21 20:45:53

标签: java foreach generic-list generic-type-argument

我正在尝试进行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调用,我调试后发现它应该是实体类型。

对为什么有任何想法吗?

1 个答案:

答案 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的,但编译器并不确定这一点。