Désolé pour le titre vague. J'ai ce morceau de code qui compile sur Eclipse Juno (4.2), mais pas javac (1.7.0_09):Java CRTP et Wildcards: le code compile dans Eclipse mais pas `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'erreur est:
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
Ainsi, les questions sont les suivantes:
Est-ce un bug
javac
ou un bug Eclipse?Y a-t-il un moyen de faire cette compilation sur
javac
, sans changer la signature de la méthodev
(à savoir garder le caractère générique)?Je sais que le changer en
<T extends N<T>> void v(final R<T> r)
le fait compiler, mais j'aimerais savoir s'il y a moyen d'éviter cela en premier. En outre, la méthodep
ne peut pas être modifiée en<T extends N<?>> void p(final T n)
car le contenu a des types qui nécessitent la contrainte exacteT extends N<T>
.
@Nambari: Il est également 1,7. De plus, Eclipse n'utilise pas javac pour compiler le code, mais son propre compilateur. – kennytm
Il compile dans mon éclipse avec java 6 quelle version java utilisez-vous? –
@AmitD: Oui cela fonctionne sur Eclipse à la fois sur 1.6 et 1.7, mais il ne compilera pas avec javac de OpenJDK 6 et 7, ni avec [JDK 6 de Sun sur ideone] (http://ideone.com/Z03W7V). – kennytm