如何避免在策略模式中使用java和泛型进行未经检查的强制转换

如何避免在策略模式中使用java和泛型进行未经检查的强制转换,java,generics,design-patterns,strategy-pattern,Java,Generics,Design Patterns,Strategy Pattern,我有一个java编码模式,这是策略模式的一种风格。我的问题是,代码需要一个未经检查的强制转换,这是我想要避免的。为了简单地解释一下,我首先有一组类,它们共享一个公共接口: interface IType {} class TypeA implements IType {} class TypeB implements IType {} 然后我有一套策略,可以对IType对象进行一些特定的处理 interface IStrategy<T extends IType> { s

我有一个java编码模式,这是策略模式的一种风格。我的问题是,代码需要一个未经检查的强制转换,这是我想要避免的。为了简单地解释一下,我首先有一组类,它们共享一个公共接口:

interface IType {}

class TypeA implements IType {}
class TypeB implements IType {}
然后我有一套策略,可以对IType对象进行一些特定的处理

interface IStrategy<T extends IType> {
    specificProcessing(T o);
}
接口策略{
特殊加工(TO);
}
最后,我有一个singleton,它对IType进行一些通用处理,然后获取适当的IStrategy来进行特定的处理。IStrategy对象在map中注册,我认为方法签名确保只有匹配的itype和IStrategy对进入map

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);
    }

}
类上下文{

私有映射使用此映射时无法避免它。我建议将映射访问移到一个单独的方法中,以便代码读取更清晰

@SuppressWarnings("unchecked")
private <T extends IType> IStrategy<T> getStrategy(T o) {
    return (IStrategy<T>) map.get(o.getClass());
}
@SuppressWarnings(“未选中”)
私人信息技术战略(TO){
return(IStrategy)map.get(o.getClass());
}
顺便说一句,你可以在scala中完成

编辑:


你可以这样做,看。但这可能只是一种花哨的方式,或者将逻辑移到它自己的方法中,但会带来很多复杂性。

我试图想出一种方法,你可以有
TypeA
TypeB
,等等,将
isttrategy
存储为每个类型的静态成员,然后有一个多态
IType
方法返回静态成员,您可以通过
o.getStrategyForType()调用该成员
。问题是,我认为要实现多态性,它必须返回没有类型参数的
IstStrategy
,然后强制转换到
IstStrategy
,仍然是一个未经检查的强制转换。是的,这会将未经检查的强制转换移动到另一个类。我认为问题的核心是没有办法(至少是afaik)要声明一个强制使用兼容的
策略
对的地图。有用的/相关的问题:@Hoons,谢谢。这篇文章有点像我的复制品,似乎不可能做到我想要的。我只是想也许更有经验的人可能会想到如何改变设计来解决它。谢谢,thHoons在上面评论中链接的e帖子得出了相同的结论。我将把问题留到周一,然后接受答案。