J'ai appris et expérimenté avec Java Generics pendant un moment, mais j'ai rencontré quelque chose que je ne peux pas expliquer. Prenons par exemple le code suivant:Classes internes typées génériques en Java
public class Question {
public <T> Sub<T> getSub(Class<T> c) {
return new Sub<T>(c);
}
public class Sub<S> {
private Class<S> c;
public Sub(Class<S> c) {
this.c = c;
}
public void add(S s) {
}
}
}
Et le code de test:
import generics.Question.Sub;
public class Answer {
public static void main(String [] args) {
Question q = new Question();
Sub<String> s = q.getSub(String.class);
s.add("");
}
}
Lorsque cela est exécuté, il donne un message d'erreur merveilleusement cryptique:
C:\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
1 error
Maintenant, grâce à une expérimentation J'ai travaillé comment empêcher l'erreur de compilateur. Je peux soit faire de la classe Sub une classe interne statique, soit faire référence à la classe Sub sous la forme Question.Sub <String>. Ce que je ne peux pas faire, c'est expliquer pourquoi j'ai besoin de faire ça.
J'ai lu la documentation Java sur Generics mais aucune ne couvre ce cas particulier.
Quelqu'un peut-il expliquer pourquoi le code est un type incompatible dans sa forme actuelle?
-Edit-
En regardant ce plus je vois que je reçois le même comportement à l'extérieur de Netbeans. Si je le code dans la structure suivante:
generics\
generics\Question.java
generics\Answer.java
Quand je compile les fichiers ensemble, je ne suis pas l'erreur:
C:\>javac generics\Question.java generics\Answer.java
C:\>
Cependant, quand je compile question d'abord, puis réponse, je obtenir l'erreur:
C:\>javac generics\Question.java
C:\>javac generics\Answer.java
generics\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
^
1 error
J'ai entendu parler de l'effacement de type. Est-ce le cas dans cette situation?
Ce code fonctionne pour moi dans Eclipse. Quel IDE/compilateur utilisez-vous? – polygenelubricants
Je peux aussi compiler sans problème en utilisant la version java "1.6.0_15" – Steen
Netbeans 6.7.1 avec JDK 1.5.0_14. Si je compile en dehors de Netbeans je suis d'accord, il compile bien. Je vais enquêter plus loin. Merci pour les commentaires. – gencoreoperative