我有一個抽象類命令。建構式如下所示:
public Command(String cmd, String helpMsg, String... args) {
this.command = cmd;
this.helpMsg = helpMsg;
this.args = args;
}
每當滿足某個條件時,我希望能夠列印出每個命令,即幫助訊息和引數。
如果我可以遍歷 Command 子類的實體,我可以為這些屬性呼叫 getter 函式。但是,我不知道如何存盤這樣的實體。我一直在閱讀有關泛型的文章,但還沒有解決這個問題。
現在我有另一個類有這個代碼:
private static Map<Class<? extends Command>, ? extends Command> instances;
public static <T extends Command> void addInstance(Class<T> tClass, T tInstance) {
instances.put(tClass, tInstance);
}
但它給了我這個錯誤:
所需型別:捕獲?擴展命令
提供:T
如果我能夠獲得單個子類的實體,那也很好getInstance(subclass.class)
uj5u.com熱心網友回復:
如果要確保類和物件屬于同一型別,則需要創建自己的映射類來強制執行此操作,或者使用現有的類,例如 Guava 的ClassToInstanceMap。
如果您只需在給定類的地圖中放置和獲取 Command 實體就足夠了,那么我建議您簡單地洗掉第二個通配符:
private static Map<Class<? extends Command>, Command> instances;
有很多很好的現有答案可以解釋擴展通配符的行為,以及為什么在嘗試插入命令實體之一時會收到警告。我絕對建議給他們閱讀:<? 超級 T> 和 <? 在 Java 中擴展 T>
uj5u.com熱心網友回復:
這可以通過創建特殊型別的 Map 來實作,其中鍵型別系結到值型別:
public class BoundMap<T> extends HashMap<Class<? extends T>, T> {
}
那么代碼就變成了:
private static BoundMap<Command> instances;
public static <T extends Command> void addInstance(Class<T> tClass, T tInstance) {
instances.put(tClass, tInstance);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494547.html
上一篇:所有號碼的介面?[復制]
