Java CRTP i Wildcards: Kod kompiluje się w Eclipse, ale nie w `javac`
Przepraszam za niejasny tytuł. Mam ten fragment kodu, który kompiluje się na Eclipse Juno (4.2), ale nie 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
}
}
Błąd jest:
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
Tak więc pytania są następujące:
To jestjavac
błąd lub błąd Eclipse?
Czy jest jakiś sposób na skompilowanie tegojavac
, bez zmiany podpisuv
metoda (tzn. zachować symbol wieloznaczny)?
Wiem, jak to zmienić<T extends N<T>> void v(final R<T> r)
sprawia, że się kompiluje, ale chciałbym wiedzieć, czy istnieje sposób, aby tego uniknąć. Również metodap
nie można zmienić na<T extends N<?>> void p(final T n)
ponieważ treść ma typy, które wymagają dokładnego ograniczeniaT extends N<T>
.