抱歉标题含糊。我有这段代码可以在 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>。