簡體   English   中英

如何避免在策略模式中使用java和泛型進行未經檢查的強制轉換

[英]How to avoid an unchecked cast with java and generics in strategy pattern

我在java中有一個編碼模式,它是策略模式的一些風格。 我的問題是代碼需要一個未經檢查的強制轉換,我想避免。 為了簡要解釋一下,我首先有一組共享一個通用接口的類:

interface IType {}

class TypeA implements IType {}
class TypeB implements IType {}

然后我有一套策略,它們對IType對象進行一些特定的處理。

interface IStrategy<T extends IType> {
    specificProcessing(T o);
}

最后,我有一個單例,它對ITypes進行一些通用處理,然后獲取適當的IStrategy來進行特定的處理。 IStrategy對象在map中注冊,我認為方法簽名確保只有匹配的IType和IStrategies對進入地圖。

class Context {

    private Map<Class<? extends IType>, IStrategy<? extends IType>> map;

    public static Context getInstance() {}

    public <T extends IType> void register(IStrategy<T> s, Class<T> c) {
        map.put(c, s);
    }

    public <T extends IType> void genericProcessing(T o) {
        //do generic stuff with o
        @SuppressWarnings("unchecked") 
        IStrategy<T> s = (IStrategy<T>) map.get(o.getClass());
        s.specificProcessing(o);
    }

}

“問題”是未經檢查的投射警告。 我知道這是因為地圖的聲明允許不匹配的IType和IStrategy對。 我也知道代碼是類型安全的,因為register()。 但有沒有其他設計可以避免未經檢查的演員?

我要感謝任何意見,謝謝。

使用此地圖時無法避免它。 我建議將地圖訪問移動到一個單獨的方法,以便代碼讀得更干凈。

@SuppressWarnings("unchecked")
private <T extends IType> IStrategy<T> getStrategy(T o) {
    return (IStrategy<T>) map.get(o.getClass());
}

順便說一下,你可以用scala來做。

編輯:

您可以在Octarine中進行 ,請參閱post Extractors上的博客 但也許這只是一種奇特的方式或將邏輯轉移到它自己的方法,但帶來了很多復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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