抱歉标题含糊。我有这段代码可以在 Eclipse Juno (4.2) 上编译,但不能在 javac (1.7.0_09) 上编译:
package test;
public final class Test {
public static class N<T extends N<T>> {}
public static class R<T extends N<T>> {
public T o;
}
public <T extends N<T>> void p(final T n) {}
public void v(final R<?> r) {
p(r.o); // <-- javac fails on this line
}
}
错误是:
Test.java:13:错误:Test 类中的方法 p 不能应用于给定类型; p(ro); ^ 要求:T 找到:N<CAP#1> 原因:推断类型不符合声明的边界 推断:N<CAP#1> 界限:N<N<CAP#1>> 其中 T 是一个类型变量: T 扩展了在方法 <T>p(T) 中声明的 N<T> 其中 CAP#1 是一个新的类型变量: CAP#1 扩展了 N<CAP#1> 从捕获的 ? 1 个错误
所以问题是:
这是一个
javac
错误还是 Eclipse 错误?有什么方法可以在
javac
不更改v
方法签名的情况下进行编译(即保留通配符)?我知道将其更改为
<T extends N<T>> void v(final R<T> r)
确实可以编译,但我想知道是否有办法首先避免这种情况。此外,该方法p
无法更改为,<T extends N<?>> void p(final T n)
因为内容具有需要精确约束的类型T extends N<T>
。