Ci scusiamo per il titolo vago. Ho questo pezzo di codice che compila su Eclipse Juno (4.2), ma non javac (1.7.0_09):Java CRTP e caratteri jolly: il codice viene compilato in Eclipse ma non `javac`
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
}
}
L'errore è:
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
Quindi le domande sono:
Si tratta di un errore
javac
o di Eclipse?C'è un modo per fare questo compilare su
javac
, senza cambiare la firma del metodov
(ad esempio, mantenere il carattere jolly)?So che cambiarlo in
<T extends N<T>> void v(final R<T> r)
lo fa compilare, ma mi piacerebbe sapere se c'è modo di evitare questo per primo. Inoltre, il metodop
non può essere modificato in<T extends N<?>> void p(final T n)
perché il contenuto ha tipi che richiedono il vincolo esattoT extends N<T>
.
@Nambari: è anche 1.7. Inoltre, Eclipse non usa 'javac' per compilare il codice, ma il suo stesso compilatore. – kennytm
Compila nella mia eclissi con java 6 quale versione di java stai usando? –
@AmitD: Sì, funziona su Eclipse sia su 1.6 che su 1.7, ma non verrà compilato con OpenJDK 6 e 7's javac, né [Sun's JDK 6 su ideone] (http://ideone.com/Z03W7V). – kennytm