Java 我可以在地图中使用类似此地图的通配符吗<;类别<>&燃气轮机;

Java 我可以在地图中使用类似此地图的通配符吗<;类别<>&燃气轮机;,java,generics,Java,Generics,我有一个私人的例子 private final Map<Class<?>, ?> map; 我该如何申报地图 如何将HashMap的对象实例化到此映射 不,简单的java.util.Map不支持此功能。它是静态类型的,您所要求的基本上是基于另一个参数的运行时类型的一个参数的动态类型 但是,该类实现的正是您想要的: 一个映射,其每个条目将Java原始类型映射到该类型的实例。除了实现Map,还提供了额外的类型安全操作putInstance(java.lang.Class,T

我有一个私人的例子

private final Map<Class<?>, ?> map;
  • 我该如何申报地图
  • 如何将HashMap的对象实例化到此映射

  • 不,简单的
    java.util.Map
    不支持此功能。它是静态类型的,您所要求的基本上是基于另一个参数的运行时类型的一个参数的动态类型

    但是,该类实现的正是您想要的:

    一个映射,其每个条目将Java原始类型映射到该类型的实例。除了实现
    Map
    ,还提供了额外的类型安全操作
    putInstance(java.lang.Class,T)
    getInstance(java.lang.Class)


    默认情况下,您不能这样做,但您可以做的是创建自己的通用安全映射,这将起作用

    GenericMap如下所示:

    class GenericMap extends HashMap<Class<?>, Object> {
    
        public <T> T putClassAndInstance(Class<T> c, T o){
            return c.cast(super.put(c, o));
        }
    
        public <T> T getInstance(Class<T> c) {
            return c.cast(super.get(c));
        }
    }
    

    这样,您就不必为用户和角色创建特殊的方法,而且仍然可以安全地为错误的类型添加错误的对象。

    是吗?OP尝试将一个
    User.class
    与角色类的实例放在一起,这些实例在类型层次结构上完全不同。@Vash:请阅读代码中的注释。他希望那一行不会编译。如果他使用了
    ClassToInstanceMap
    putInstance
    ,那么它将无法编译。谢谢你的回答!这对我真的很有帮助。我还添加了一个合适的
    getInstance
    方法(这基本上就是
    ClassToInstanceMap
    所做的)。完美。我喜欢这个答案。非常简单和整洁!Joachim,我已经添加了您的建议,还通过使用cast方法删除了@SuppressWarnings。+1但我建议使用组合而不是继承,这样您就可以隐藏基础映射的实现。相关:
    class GenericMap extends HashMap<Class<?>, Object> {
    
        public <T> T putClassAndInstance(Class<T> c, T o){
            return c.cast(super.put(c, o));
        }
    
        public <T> T getInstance(Class<T> c) {
            return c.cast(super.get(c));
        }
    }
    
    GenericMap map = new GenericMap();
    
    map.putClassAndInstance(User.class, new User()); // valid
    map.putClassAndInstance(User.class, new UserSubclass()); // valid
    map.putClassAndInstance(Role.class, new Role()); // valid
    map.putClassAndInstance(User.class, new Role()); // invalid, compiler error