繁体   English   中英

具有类型安全集合作为价值的类型安全异构容器设计模式

[英]Typesafe Hetereogeneous Container design pattern with typesafe collections as value

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

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

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

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

该类型本身是安全的(Map.class),但我不知道如何确保地图的键和值的类型为long和string。 我该如何使用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);

使用此实现,将其映射为以String作为键并且以整数作为值的映射并不安全。 我想存储各种对象和集合,但是集合本身也必须是类型安全的。

不确定您的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类型,因此第二个put无法编译。 该类型声明仅将扩展为Long的对象作为第一个参数,而第二个仅接受扩展为String的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM