gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:04:07 25 4
gpt4 key购买 nike

我在 Java 中有一个编码模式,它是策略模式的某种风格。我的问题是代码需要我想避免的未经检查的转换。为了简要说明,我首先有一组共享公共(public)接口(interface)的类:

interface IType {}

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

然后我有一组策略可以对 IType 对象进行一些特定的处理。

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

最后,我有一个单例,它对 IType 进行一些通用处理,然后获取适当的 IStrategy 来进行特定处理。 IStrategy 对象在映射中注册,我认为方法签名确保只有匹配的 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);
}

}

“问题”是未经检查的强制转换警告。我知道发生这种情况是因为 map 的声明允许不匹配的 IType 和 IStrategy 对。我还知道由于 register(),代码是类型安全的。但是有没有其他设计可以避免未经检查的转换?

如果有任何意见,我将不胜感激。

最佳答案

使用这张 map 是没办法避免的。我建议将 map 访问移到一个单独的方法中,这样代码读起来更清晰。

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

顺便说一句,你可以在 scala 中完成。

编辑:

您可以在 Octarine 中完成, 请参阅 blog on post Extractors .但也许这只是一种奇特的方式或将逻辑转移到它自己的方法中,但会带来很多复杂性。

关于java - 如何避免在策略模式中使用 java 和泛型进行未经检查的强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com