Tengo el código de un juego simple, donde se debe implementar AgentInterface para crear un controlador de agente para uno de los personajes del juego. GameState es una clase que implementa GameStateInterface, y un objeto que implementa esta interfaz se puede pasar al agente, por lo que el agente puede leer y analizar los datos del estado del juego, y el agente debe devolver la acción apropiada (devuelta como un int) que el personaje debería tomar.¿Es posible bloquear/denegar una conversión de conversión en Java?
Este es el AgentInterface que los agentes deben implementar:
public interface AgentInterface {
// the return value specifies the direction of the joystick
public int action(GameStateInterface gs);
}
ejecutar el juego con un agente llamado MyAgent:
GameState gs = new GameState();
AgentInterface agent = new MyAgent();
while (true) {
// more code here
int bestAction = agent.action(gs)
// more code here
}
embargo, hay cierta información en gamestate que el agente no debe ser poder acceder, ya que eso sería hacer trampa para el controlador. Pero, haciendo una conversión elenco de GameStateInterface a gamestate permitiría que el agente para acceder a la información que no está definido en el GameStateInterface, así:
public MyAgent implements AgentInterface {
public int action(GameStateInterface gs) {
int nLives = ((GameState) gs).nLivesRemaining; // IS IT POSSIBLE TO DENY/PREVENT THIS CAST??
// Do more stuff here
return BestAction;
}
}
Mi pregunta sería, ¿es posible bloquear una conversión reparto? Sé que el polimorfismo es una de las características principales de Java y de los lenguajes de programación orientados a objetos, pero en casos como este me gustaría evitar las conversiones de conversión.
Sé que esto puede resolverse de muchas otras maneras, pero tenía curiosidad por saber si es posible hacer esto.
Gracias de antemano.
Parece una buena solución. +1 –
Advertencia: asegúrese de tener su seguridad de Java configurada para que el código del agente (es decir, no confiable) no pueda usar las API de Reflection. Hay formas en que alguien podría usar la reflexión para acceder al miembro privado de una clase proxy para obtener el objeto GameState. –