为什么下面的代码无法编译?可以简化此示例(减少类数)以演示等效错误吗?
产生的错误消息是:
... 中的 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)
哪里b
是 B
, 你?因此,考虑到我仅更改了赋值的右侧(而不是 c
的声明类型),您的示例编译但我的示例不编译会很奇怪。这有帮助吗?
一如既往,请参阅Java Generics FAQ欲了解更多信息,特别是关于 wildcards 的部分.
关于Java 泛型 : compilation failure using captures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485005/