【问题标题】:Typesafe Hetereogeneous Container design pattern with typesafe collections as value以类型安全集合为值的类型安全异构容器设计模式
【发布时间】:2015-07-16 14:43:03
【问题描述】:

我想创建一个类型安全的集合,它可以存储多个相同类型但具有类型安全参数的集合。标准方式:

Map<Key<?>, Object> container = new HashMap<>();

键包含对象的类型,get 方法转换为正确的类型(标准类型安全异构容器模式)。但我需要这样的东西:

container.put(Key, new HashMap<Long, String>);

类型本身是安全的(Map.class),但我不知道如何确保映射的键和值是长字符串类型。我怎么能用java做到这一点?

编辑

为了让事情更清楚:

Map<Class<?>, Object> container = new HashMap<>();

现在这个映射的类型安全实现:

public <T> void put(Class<T> key, T value) {
    container.put(key, value);
  }

  public <T> T get(Class<T> key) {
    return key.cast(container.get(key));
  }

我现在可以以一种类型安全的方式做到这一点:

containerClass.put(Double.class, 2.0);
containerClass.put(Integer.class, 3);

当然还有:

containerClass.put(MyObject.class, myObject);

如果我想存储多个相同类型的值,我可以使用通用列表而不是对象作为值或具有标识符作为字段的特定键类。

但是

现在会发生什么?

Map<String, Integer> map = new HashMap<>();
containerClass.put(Map.class, map);

在这个实现中,它是一个以字符串为键、整数为值的映射是不安全的。我想存储各种对象和集合,但集合本身也必须是类型安全的。

【问题讨论】:

    标签: java design-patterns collections type-safety


    【解决方案1】:

    不确定您的 Key 类是什么,但以下可能是您正在寻找的,只需将 String 替换为您的 Key 类

        Map<String, Map<? extends Long, ? extends String>> container = new HashMap<>();
        container.put("", new HashMap<Long, String>());
        container.put("", new HashMap<Long, Long>());
    

    如果您尝试编译该代码,您会发现第一个 put 没问题,但由于不符合 Map 类型,第二个将无法编译。该类型声明仅接受扩展 Long 的对象作为第一个参数,而第二个仅接受扩展 String 的对象。

    【讨论】:

    • 这里的问题是map的值必须是map的类型。我想要典型的类型安全异构容器模式。所以我希望能够将各种数据类型放入该映射中,但也可以将列表或映射作为值。我想确保我用作值的可能映射本身是类型安全的。
    • 我现在很困惑,地图太多了。哪个地图值必须是地图类型?如果你的意思是你的 map, Object> 值,即 Object 必须是 Map 类型,那么我给你的就是 Map 将 Object 限制为一个 Map 类型,该类型以 Long 为键,带有一个 String 值,这是您想要的,因此将接受任何实现 Map 具有指定通用类型的 Object。如果不是,那么也许您可以更清楚地解释哪个地图值必须是 Map 类型?
    • 由于LongString 都是最终的,? extends 并没有太大的区别。
    • 他们只是将地图类型限制为 Long 和 String 而已,这正是我们想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多