【问题标题】:Why I cannot directly use for-each loop for generic type list?为什么我不能直接将 for-each 循环用于泛型类型列表?
【发布时间】:2019-06-21 20:45:53
【问题描述】:

我正在尝试执行一个 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 会抱怨“不兼容的类。必需的对象,找到 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调用,我调试了一下发现应该是Entity类型的。

知道为什么吗?

【问题讨论】:

  • 能否展示response.getResponses()的完整方法定义,以及response的声明? --- "IDE 将显示 "Cannot resolve symbol 'T'"" - 为了使用T,您需要在类或方法上定义T。如果您不想或无法定义T,请使用?(可能带有通配符)。
  • 在您的第二个示例中,关于该特定行的错误是什么?假设没有交换其他代码,第一个和第二个应该是等效的
  • 你需要先在你的泛型方法中声明 T,public static List>
  • @MatthewKerian 是的,关于“MyClass a”会有一条红色下划线
  • Response 在哪里实例化?泛型 T 不扩展任何东西,所以编译器无法判断它应该是什么类型,所以它默认为 Object。

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


【解决方案1】:

如果不查看更多代码库,我无法给出个人答案来解决它,但实际问题很明显。

Response 是一个具有泛型类型的类。 https://www.baeldung.com/java-generics

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

T 不扩展任何东西,所以默认情况下它扩展 Object.这就是为什么如果你做ArrayList myList 它等同于ArrayList&lt;Object&gt; myList。如果您可以更改响应,则可以将泛型更新为&lt;T extends Entity&gt;,它会起作用。这是假设每个通用对象 T 都将是某种实体对象。

问题是在您的程序中的某个时刻,您丢失了对象是什么的细节,请考虑一下。

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

该代码的问题是您期待响应,但由于从未指定类型,因此默认为Response&lt;Object&gt; r = new Response()。虽然从技术上讲它可能会在后台返回 Response,但编译器并不确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2010-10-30
    • 2020-03-24
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2020-09-17
    相关资源
    最近更新 更多