6 java generics class-design return-type
我有以下类结构:
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>>{
}
Run Code Online (Sandbox Code Playgroud)
我试图模拟所有类型的体育赛事(即"夹具"是针对两个参与者之间的特定游戏,而另一个类型的"事件"可能有许多参与者),以及对特定结果的预测"事件".我有一个通用的方法:
public <T> MyPrediction<Fixture<? extends Team>> getMyPrediction(Fixture<? extends Team> fixture) {
Run Code Online (Sandbox Code Playgroud)
}
我希望能够返回一个MyPrediction具有泛型类型fixture参数的实例,但我似乎无法这样做.例如,如果我执行类似下面的操作,那么我会收到编译错误:
SoccerFixture<EnglishSoccerTeams> soccerMatch = new ScoccerFixture<EnglishSoccerTeams>();
MyPrediction<SoccerFixture<EnglishSoccerTeams>> = getMyPrediction(soccerMatch);
Run Code Online (Sandbox Code Playgroud)
我愿意改变我的类结构以包含此功能.我怎么能这样做?
将签名更改getMyPrediction为
public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture)
Run Code Online (Sandbox Code Playgroud)
这告诉编译器参数和结果中的固定类型是相同的,从而允许类型检查通过。
这是一个完整的示例,还进行了一些其他细微的更改以使其能够编译。Predictor它引入了保存该方法的类getMyPrediction和doit显示示例使用的方法:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
正如其他地方所指出的,您可能需要引入一个或多个工厂对象来在实现中执行有意义的工作MyPrediction。