Java CRTP и Wildcards: код компилируется в Eclipse, но не `javac`
Извините за смутное название. У меня есть этот кусок кода, который компилируется в 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: error: method p in class Test cannot be applied to given types; p(r.o); ^ required: T found: N<CAP#1> reason: inferred type does not conform to declared bound(s) inferred: N<CAP#1> bound(s): N<N<CAP#1>> where T is a type-variable: T extends N<T> declared in method <T>p(T) where CAP#1 is a fresh type-variable: CAP#1 extends N<CAP#1> from capture of ? 1 error
Итак, вопросы:
Этоjavac
ошибка или ошибка затмения?
Есть ли способ сделать эту компиляцию на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>
.