[英]Java - Return correct type from Generic method
我有以下類結構:
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>>{
}
我試圖模擬所有類型的體育賽事(即“夾具”是針對兩個參與者之間的特定游戲,而另一個類型的“事件”可能有許多參與者),以及對特定結果的預測“事件”。 我有一個通用的方法:
public <T> MyPrediction<Fixture<? extends Team>> getMyPrediction(Fixture<? extends Team> fixture) {
}
我希望能夠返回一個具有fixture
參數的泛型類型的MyPrediction
實例,但我似乎無法這樣做。 例如,如果我執行類似下面的操作,那么我會收到編譯錯誤:
SoccerFixture<EnglishSoccerTeams> soccerMatch = new ScoccerFixture<EnglishSoccerTeams>();
MyPrediction<SoccerFixture<EnglishSoccerTeams>> = getMyPrediction(soccerMatch);
我願意改變我的類結構以包含此功能。 我怎么能這樣做?
由於類型擦除(通用參數在運行時不可用),Java的類型系統不夠強大,無法直接執行您的建議。
通常的解決方案是創建一個單獨的EventFactory類,然后您可以將其傳遞給需要創建特定Event子類型實例的任何方法。
將getMyPrediction
的簽名更改為
public <T extends Fixture<? extends Team>> MyPrediction<T> getMyPrediction(T fixture)
這告訴編譯器參數和結果中的fixture類型是相同的,允許類型檢查通過。
這是一個完整的示例,還有一些其他的小改動可以讓它進行編譯。 它引入了一流的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);
}
}
如其他地方所述,您可能需要引入一個或多個工廠對象以在MyPrediction
實現中執行有意義的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.