Java - 从Generic方法返回正确的类型

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)

我愿意改变我的类结构以包含此功能.我怎么能这样做?

WRe*_*ach 0

将签名更改getMyPrediction

public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture)
Run Code Online (Sandbox Code Playgroud)

这告诉编译器参数和结果中的固定类型是相同的,从而允许类型检查通过。

这是一个完整的示例,还进行了一些其他细微的更改以使其能够编译。Predictor它引入了保存该方法的类getMyPredictiondoit显示示例使用的方法:

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