Actualmente estoy desarrollando un marco de simulación de peso ligero y de propósito general. El objetivo es permitir que las personas subclasifiquen los objetos de simulación y escenario para sus necesidades específicas de dominio. Los genéricos parecían una forma apropiada de lograr esto, pero me temo que podría estar sumergiéndome en el infierno de los genéricos.Infierno de genéricos de Java - Pasando en esto, pero quiere tipo T
El objeto Sim
proporciona acceso a las entidades de simulación y controla el SIM (inicio/pausa/parada)
El objeto Scenario
permite rellenar el Sim con entidades de simulación.
Sim:
public class Sim
{
public <T extends Sim> void loadScenario(Scenario<T> scenario)
{
reset();
scenario.load(this);
}
}
Escenario:
public interface Scenario<T extends Sim>
{
public void load(T sim);
}
El objetivo es permitir a los usuarios crear una MySim
que extends Sim
y una MyScenario
que implements Scenario<MySim>
para su dominio.
p. Ej. MyScenario:
public class MyScenario<MySim>
{
public void load(MySim sim)
{
// make calls to sim.addMySimEntity(...)
}
}
Específicamente, utilizando el código anterior, la llamada scenario.load(this)
en Sim.loadScenario
me da el error: El método load (T) en el Escenario de tipo no es aplicable para los argumentos (SIM). Entiendo que esto es porque estoy cargando this
(que es del tipo Sim
) cuando lo que se requiere es T extends Sim
lo que significa que de alguna manera debería pasar un objeto que puede ser cualquier subtipo de Sim.
¿Cuál es la forma de rectificar este problema para lograr lo que quiero lograr? O, ¿es posible? Quizás los genéricos no pueden hacer esto por mí.
Creo que esto puede estar relacionado con una pregunta que hice sobre referencias genéricas circulares: http://stackoverflow.com/questions/2567595/creating-circular-generic-references –