Ho studiato e sperimentato con Java Generics per un po ', ma mi sono imbattuto in qualcosa che non posso spiegare. Prendiamo ad esempio il seguente codice:Classi interne tipizzate generiche in 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) {
}
}
}
E il codice di prova:
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("");
}
}
Quando questo viene eseguito dà un messaggio di errore meravigliosamente criptico:
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
Ora, attraverso alcuni esperimenti Ho capito come prevenire l'errore del compilatore. Posso rendere la classe Sub una classe interna statica oppure ho bisogno di fare riferimento alla classe Sub come Question.Sub <String>. Quello che non posso fare è spiegare perché ho bisogno di farlo.
Ho letto qualche parte della documentazione Java su Generics ma nessuno copre questo caso particolare.
Qualcuno può spiegare perché il codice è un tipo incompatibile nella sua forma attuale?
operativa -Editazione-
Guardando a questo più mi rendo conto che ho lo stesso comportamento al di fuori di Netbeans. Se ho il codice nella seguente struttura:
generics\
generics\Question.java
generics\Answer.java
Quando compilo i file insieme, non ottengo l'errore:
C:\>javac generics\Question.java generics\Answer.java
C:\>
Tuttavia, quando compilo Domanda e poi risposta, io ottenere l'errore:
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
Ho sentito qualcosa menzionato su Type Erasure. È questo il caso in questa situazione?
Questo codice funziona per me in Eclipse. Quale IDE/compilatore stai usando? – polygenelubricants
Posso anche compilarlo senza problemi usando la versione java "1.6.0_15" – Steen
Netbeans 6.7.1 con JDK 1.5.0_14. Se lo compilo al di fuori di Netbeans sono d'accordo, compila bene. Investigherò ulteriormente. Grazie per il feedback. – gencoreoperative