Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap<;类别<>;,列表<;类别<&燃气轮机&燃气轮机>;:指定列表';类扩展键';_Java_Generics_Hashmap - Fatal编程技术网

Java HashMap<;类别<>;,列表<;类别<&燃气轮机&燃气轮机>;:指定列表';类扩展键';

Java HashMap<;类别<>;,列表<;类别<&燃气轮机&燃气轮机>;:指定列表';类扩展键';,java,generics,hashmap,Java,Generics,Hashmap,我的一个类需要根据类的超类存储类。为此,我使用了一个HashMap,其中键是超类,值是它们扩展类的列表。看起来是这样的: HashMap<Class<?>, List<Class<?>>> HashMap>> 我想知道是否有一种符号可以让我更精确,比如: HashMap<Class<T>, List<Class<? extends T>>> HashMap您可以使用访问器方法来实现这一点 //

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

HashMap<Class<?>, List<Class<?>>>
HashMap>>
我想知道是否有一种符号可以让我更精确,比如:

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

HashMap您可以使用访问器方法来实现这一点

// 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.
}
//仅通过检查键和值是否为正确类型的方法访问。
最终映射=新LinkedHashMap();
公共无效添加(类键、类值){
List=map.get(键);
if(list==null)
put(key,list=newarraylist());
列表。添加(值);
}
公共Listget(类密钥){
返回(列表)映射。获取(键);
}
公共布尔包含(类键、类值){
List=map.get(键);
if(list==null)返回false;
返回列表。包含(值);
}
公共静态void main(字符串…参数){
Main m=新的Main();
m、 add(Number.class,Integer.class);//编译
m、 add(Number.class,String.class);//不编译。
}
类似于:

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

}

classmymap+1。但是请注意m.add(Number.class,Number.class);也编译。你是对的,
扩展
在这种情况下不必是一个严格的子类。你如何用这种方式编写getter呢?@Raveline,添加了一些示例。它间接地给出了你想要的,因为我不相信它可以直接完成。