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