2011-01-15 21 views
6

tengo la siguiente estructura de clases:Java - Retorno tipo correcto de método genérico

public class Team { 
    ... 
} 

public class Event { 

} 

public abstract class Fixture<T extends Team> implements Event { 
    ... 
} 

public abstract class Forecast<Event> { 

} 

public class MyPrediction<T extends Fixture<? extends Team>> extends Forecast<Fixture<? extends Team>>{ 

} 

Estoy tratando de modelar los acontecimientos deportivos de todo tipo (es decir, un 'accesorio' es para un juego en particular entre dos participantes juegan uno contra el otro, mientras que otro tipo de 'Evento' puede tener muchos participantes), junto con predicciones para el resultado de 'Eventos' particulares. Tengo un método genérico:

public <T> MyPrediction<Fixture<? extends Team>> getMyPrediction(Fixture<? extends Team> fixture) { 

}

Quiero ser capaz de devolver una instancia MyPrediction que tiene el tipo genérico del argumento fixture, pero me parece que no puede hacerlo. Por ejemplo, si hago algo como lo siguiente, cuando me siento un error de compilación:

SoccerFixture<EnglishSoccerTeams> soccerMatch = new ScoccerFixture<EnglishSoccerTeams>(); 
MyPrediction<SoccerFixture<EnglishSoccerTeams>> = getMyPrediction(soccerMatch); 

estoy dispuesto a cambiar mi estructura de clases para incorporar esta característica. ¿Como lo puedo hacer?

+1

"Si hago algo como lo siguiente" ... entonces (¿qué problema encuentras)? –

+0

parece que el evento debe ser una interfaz –

Respuesta

1

cambiar la firma de getMyPrediction a

public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) 

Esto le dice al compilador que los tipos de aparatos en el argumento de una El resultado nd es el mismo, permitiendo pasar la verificación de tipo.

Aquí hay un ejemplo completo, con algunos otros cambios menores para que compile. Se introduce la clase Predictor para sostener el método getMyPrediction y un método para mostrar doit uso de la muestra:

public interface Team { 
} 

public interface Event { 
} 

public abstract class Fixture<T extends Team> implements Event { 
} 

public abstract class Forecast<T> { 
} 

public class MyPrediction<T extends Fixture<? extends Team>> extends 
     Forecast<Fixture<? extends Team>> { 
} 

public class SoccerFixture<T extends SoccerTeam> extends Fixture<T> { 
} 

public class SoccerTeam implements Team { 
} 

public class EnglishSoccerTeam extends SoccerTeam { 
} 

public class Predictor { 

    public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture) { 
     return new MyPrediction<T>(); 
    } 

    public void doit() { 
     SoccerFixture<EnglishSoccerTeam> soccerMatch = new SoccerFixture<EnglishSoccerTeam>(); 
     MyPrediction<SoccerFixture<EnglishSoccerTeam>> myPrediction = getMyPrediction(soccerMatch); 
    } 
} 

Como se ha señalado en otro lugar, puede que tenga que introducir uno o más objetos de fábrica para llevar a cabo un trabajo significativo en la implementación MyPrediction.

0

sistema de tipos de Java no es lo suficientemente potente como para ver directamente lo que se propone, a causa de tipo borrado (los parámetros genéricos no están disponibles en tiempo de ejecución.

La solución habitual es crear una clase EventFactory separado, que se puede a continuación, pasar a cualquier método que necesita para crear una instancia específica subtipo de eventos.

Cuestiones relacionadas