首页 > 解决方案 > 关于Java中通配符捕获的困惑

问题描述

我读过一篇关于通配符捕获如何在 java 中工作的文章。在本节中,作者说明了编译器如何捕获通配符类型并进行一些转换。

但是我的困惑是在编译了以下代码之后出现的(代码本身没有任何意义,我只是想测试java中的通配符捕获):

public class Test {
    public static void main(String[] args) {
    }

    public static void copy(List<?> src, List<?> dest) {
        for (int i = 0; i < dest.size(); i++) {
            dest.set(i, src.get(i));
        }
    }
}

我得到一个编译时错误:

Error:(9, 32) java: incompatible types: java.lang.Object cannot be converted to capture#1 of ?

根据那篇文章,编译器应该能够捕获通配符类型src并将其转换为类似List<capture#2>

但是为什么错误说的类型src.get(i)Object,而不是类似的东西capture#2

如果那个帖子是错误的,通配符捕获实际上是如何工作的?

标签: javagenerics

解决方案


我还没有查看链接,但我真的怀疑这与您在此处发布的内容相同...

实际上List<?> src意味着您唯一可以从中检索的List是一个Object(除非您知道类型并且可以转换它,当然这可能会失败:)String s = (String) src.get(0);

List<?> dest意味着这个目的地实际上是只读的,因为?意味着你可以添加任何东西,, String,Integer等等 - 当你添加不同的类型时你会破坏它的完整性,因此这是被禁止的。


推荐阅读