【发布时间】:2019-05-26 16:12:37
【问题描述】:
以下示例虽然看似正确,但无法编译(Eclipse Neon 3、Java 1.8):
class Test {
public static class SomeForm<IF extends SomeForm<IF>> {
}
public static class BaseFF<IF extends SomeForm<IF>> {
}
public static class AuxFF<IF extends SomeForm<IF>>
extends BaseFF<IF> {
}
public interface Interface<IF extends SomeForm<IF>, FF extends BaseFF<IF>> {
FF getFF1();
}
public static class ZBaseUnit<IF extends SomeForm<IF>, FF extends BaseFF<IF>>
implements Interface<IF, FF> {
@Override
public FF getFF1() {
return null;
}
}
public static class ZMyUnit<IF extends SomeForm<IF>, FF extends AuxFF<IF>>
extends ZBaseUnit<IF, FF> {
}
public static class ZMyCheck<IF extends SomeForm<IF>, U extends ZMyUnit<IF, ?>> {
U unit;
void f() {
BaseFF<IF> ff1 = unit.getFF1();
}
}
}
Eclipse 说(在 f() 方法内的一行):
“类型不匹配:无法从 capture#2-of ? 转换为 Test.BaseFF”。
但是,如果我从接口 Interface(以及 ZBaseUnit 类中的 @Override 注释)中删除方法 getFF1,它会编译。这背后有什么逻辑吗?直观上看,传给Interface的FF和传给ZBaseUnit的FF是一样的,所以应该没有区别……
另外,如果我在 ZMyUnit 中添加方法没有错误:
void f() {
BaseFF<IF> ff1 = getFF1();
}
任何帮助将不胜感激!
【问题讨论】:
-
更有趣的是:我不会假设
ZMyUnit<IF, ? > unit;而不是U unit;来编译,因为在这两种情况下你指的是同一个基类。但它可以编译。
标签: java eclipse generics compiler-errors