java - 无需强制转换即可将值添加到 HashMap

标签 java generics

我有一个名为 InterA 的接口(interface),它有一个方法调用 operate(),其返回值为 Result。

 public interface InterA<T>
 {
    Result operate(T source);
 }

假设 MachineOperator 类和 CarOperator 类是上述具有两种 T 对象类型的实现。

 public class MachineOperator implements InterA<Machine>
 {
    Result operate(Machine source)
    {
      //Do some operation here and return result.
    }
}

public class CarOperator implements InterA<Car>
{
    Result operate(Car source)
    {
       //Do some operation here and return result.
    }
}

我想将这些实现保存在一个映射中,这样当我给类时我就可以得到实现。所以我的 map 会是这样的。

Map<Class<?>, InterA<T>> map = new HashMap<>();

当我去填充 map 时,我必须执行以下操作,

map.put(Machine.class, (InterA<T>) new MachineOperator());
map.put(Car.class, (InterA<T>) new CarOperator());

有没有什么方法可以定义 map ,这样在添加时就不再需要转换了?

============================================= ==============

我也尝试了以下方法,可以在添加到 map 时避免强制转换。

public interface InterA
{
    Result <T> operate(T source);
}

然后在每个实现中,我必须为每个 T 进行额外的转换。

public class MachineOperator implements InterA
{
    < Machine> Result operate(Machine source)
 {
    (Machine) source; //Need to cast for Machine In-order to read attributes.
    //Do some operation here and return result.
 }
}

其中什么是正确的方法?有什么不同的解决方案吗?

最佳答案

您可以为您的 Map 编写一个包装器,以允许仅添加相应的 InterA 对象:

class ClassMap {
    private Map<Class<?>, InterA<?>> map = new HashMap<>();
    public <T> void put(Class<T> key, InterA<T> value) {
        map.put(key, value);
    }
    //we suppress unchecked cast warning because for Class<T> key we can put only InterA<T> value
    @SuppressWarnings("unchecked")
    public <T> InterA<T> get(Class<T> key) {
        return (InterA<T>) map.get(key);
    }
}

然后你就可以这样使用了

ClassMap map = new ClassMap();
map.put(Machine.class, new MachineOperator());
InterA<Machine> operator = map.get(Machine.class);

关于java - 无需强制转换即可将值添加到 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47724111/

相关文章:

java - 将 TextView 设置为新字符串?

c# - 获取部分开放泛型类型的类型表示

java - 为什么 <T extends Enum<T> & SomeInterface> 编译,而不是 <T extends SomeInterface & Enum<T>>?

C#:泛型语法问题

java - 如何使用 Android Volley 发布 JSON 数组并获取 JSON 对象作为响应?

java - 发送带有负载 Volley 的 GET 请求

java - 从 HttpUrlConnection 对象获取 header

java - 从 AWS 下载图像会导致文件损坏

c# - 接口(interface)接口(interface) <T> : T

c# - 转换类型时遇到问题