He estado aprendiendo y experimentando con Java Generics por un tiempo, pero me encontré con algo que no puedo explicar. Tomemos como ejemplo el siguiente código:Genérico Typed Inner Classes 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) {
}
}
}
Y el código de prueba:
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("");
}
}
Cuando esto se ejecuta se da un mensaje de error maravillosamente críptica:
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
Ahora, a través de algunos experimentos He resuelto cómo prevenir el error del compilador. Puedo hacer que la clase Sub sea una clase interna estática, o necesito referirme a la clase Sub como Question.Sub <String>. Lo que no puedo hacer es explicar por qué tengo que hacer esto.
He leído un poco la documentación de Java sobre genéricos, pero ninguno cubre este caso en particular.
¿Alguien puede explicar por qué el código es un tipo incompatible en su forma actual?
operación -Editar-
En cuanto a esta más cerca que puedo ver que me sale el mismo comportamiento fuera de Netbeans. Si tengo el código de la siguiente estructura:
generics\
generics\Question.java
generics\Answer.java
Cuando puedo compilar los archivos juntos, que no entiendo el error:
C:\>javac generics\Question.java generics\Answer.java
C:\>
Sin embargo, cuando compilo pregunta primero y luego responder, Obtenga el error:
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
He escuchado algo acerca de Type Erasure. ¿Es este el caso en esta situación?
Este código funciona para mí en Eclipse. ¿Qué compilador IDE estás usando? – polygenelubricants
También puedo compilar esto sin problemas usando la versión de Java "1.6.0_15" – Steen
Netbeans 6.7.1 con JDK 1.5.0_14. Si compilo fuera de Netbeans, estoy de acuerdo, compila bien. Investigaré más a fondo. Gracias por la respuesta. – gencoreoperative