Pensé que entendía genéricos bastante bien, pero al parecer no lo hice.Domando el verificador de tipos en Java Generics
Aquí es el caso de la prueba del problema:
import java.util.ArrayList;
class Job<J extends Job<J,R>, R extends Run<J,R>> {}
class Run<J extends Job<J,R>, R extends Run<J,R>> {}
class Job2 extends Job<Job2,Run2> {}
class Run2 extends Run<Job2,Run2> {}
class RunList<J extends Job<J,R>, R extends Run<J,R>> extends ArrayList<R> {}
class Foo {
// #1 problem
public void test1(RunList<Job,Run> why) {}
// #2 this doesn't work either
public void test2(RunList<Job<Job,Run>,Run<Job,Run>> why) {}
// #3 this works
public void test3(RunList<Job2,Run2> why) {}
}
El compilador no permite el método test1 anterior, diciendo que "trabajo" no está dentro de sus límites tipo. De alguna manera lo entiendo --- Job
como un tipo sin formato no se extiende Job<Job,Run>
, de ahí el error. Por el contrario, test3 funciona.
Ahora, la pregunta es, ¿cómo hago que esto funcione? He intentado # 2, pero eso tampoco funciona. El problema que supongo que es realmente similar con # 1 --- Job<Job,Run>
no está dentro de los límites porque su argumento de tipo Job
es un tipo sin formato.
¿Alguien sabe cómo hacer feliz al verificador de tipos, además de recurrir al tipo sin procesar? ¿O simplemente no es alcanzable en el sistema de tipo Java?
¿Puede proporcionar cualquier información adicional sobre lo que se quiere trabajar? Parece que tienes una solución: ¿cuál es el que quieres trabajar y por qué? – mlschechter
Tenga en cuenta que el # 3 es semánticamente diferente, y no es una solución --- ni siquiera es una solución. # 3 efectivamente le da ArrayList, por lo que, por ejemplo, no puede agregar el objeto Run simple allí. Quiero RunList con trabajos y ejecuciones simples, de modo que, por ejemplo, puedo poner un objeto Run simple en él. # 2, si se trabaja, lograría algo similar. –