Java 泛型 : compilation failure using captures

标签 java generics compiler-errors capture

为什么下面的代码无法编译?可以简化此示例(减少类数)以演示等效错误吗?

产生的错误消息是:

... 中的 func(capture of ? extends A) 无法应用于 B

    private static interface A {}
    private static class B implements A {}

    private static class C<T> {
        private final T t;
        private C(T t) {
            this.t = t;
        }
        private void func(T t) {}
    }

    @Test
    public void doTest() {
        B b = new B();
        C<? extends A> c = new C<B>(b);
        c.func(b); // fails here
    }

最佳答案

问题是 C<? extends A>意思是“它是某种类型 C<T>T ,但我不知道它是什么类型 - 只知道它是扩展 A 的东西。”

这意味着您不能假设 T = B ,或者有来自 B 的转换至T 。但这正是您所做的尝试在这里假设的:

c.func(b);

为了演示为什么它无效,假设我们对您的代码进行了更改:

private static class X implements A {}

B b = new B();
C<? extends A> c = new C<X>(new X());
c.func(b);

现在更明显的是它不应该编译 - 如果你有 C<X> ,您不希望能够调用 func(b)哪里bB , 你?因此,考虑到我更改了赋值的右侧(而不是 c 的声明类型),您的示例编译但我的示例不编译会很奇怪。这有帮助吗?

一如既往,请参阅Java Generics FAQ欲了解更多信息,特别是关于 wildcards 的部分.

关于Java 泛型 : compilation failure using captures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485005/

相关文章:

java - 重试失败的文件上传到 AWS S3

java - 使用 Jackson 将 Java 列表序列化为 XML 和 JSON

delphi - 为什么这段代码在 XE3 中无法编译

c# - 从 Idisposable 实现泛型类时编译时的不同行为?

c++ - 为没有模板参数的可变模板递归创建基本情况

java - 是否可以在运行时加载库?

java - Excel 中的空单元格返回 Null(Java、POI)

java - 如何获取内部泛型类型使用的注释?

exception - 如何在线程 “main” java.lang.NullPointerException中修复异常

c++ - 没有括号时,输入结尾处的预期 '}'