【问题标题】:HashMap<Class<?>, List<Class<?>>> : specify that the lists' classes extend the keys'HashMap<Class<?>, List<Class<?>>> :指定列表的类扩展键
【发布时间】:2011-11-18 14:33:53
【问题描述】:

我的一个班级需要根据他们的超类来存储班级。为此,我使用了 HashMap,其中键是超类,值是其扩展类的列表。所以它看起来像这样:

HashMap<Class<?>, List<Class<?>>>

我想知道是否有一个符号可以让我更精确,例如:

HashMap<Class<T>, List<Class<? extends T>>>

我已经尝试过了,当然,它不起作用:T 无法解决。有没有一种语法可以让我这样做?提前感谢您的帮助。

【问题讨论】:

    标签: java generics hashmap


    【解决方案1】:

    您可以使用访问器方法来做到这一点。

    // only accessed by methods which check the keys and values are the right type.
    final Map<Class, List<Class>> map = new LinkedHashMap<Class, List<Class>>();
    
    public <T, S extends T> void add(Class<T> key, Class<S> value) {
        List<Class> list = map.get(key);
        if (list == null)
            map.put(key, list = new ArrayList<Class>());
        list.add(value);
    }
    
    public <T, S extends T> List<Class<S>>get(Class<T> key) {
        return (List<Class<S>>) map.get(key);
    }
    
    public <T, S extends T> boolean contains(Class<T> key, Class<S> value) {
        List<Class> list = map.get(key);
        if (list == null) return false;
        return list.contains(value);
    }
    
    public static void main(String... args) {
        Main m = new Main();
        m.add(Number.class, Integer.class); // compiles
        m.add(Number.class, String.class); // does not compile.
    }
    

    【讨论】:

    • +1。但是请注意 m.add(Number.class, Number.class);也可以编译。
    • 你说得对,extends 在这种情况下不必是严格的子类。
    • 您将如何使用这种处理方式对 getter 进行编码?
    • @Raveline,添加了一些示例。
    • 它间接地给了你想要的,因为我不相信它可以直接完成。
    【解决方案2】:

    类似:

    class MyMap<T extends Class<?>> extends HashMap<T, List<T>> {
    
    }
    

    不会完全解决您的问题。您可以看到,在地图中的单个条目上,它不会发生变化。

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2016-07-21
      • 1970-01-01
      • 2014-12-17
      • 2017-03-27
      • 2020-08-03
      相关资源
      最近更新 更多