簡體   English   中英

Java - 從Generic方法返回正確的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM