Java 8:如何将Map <k,v =“”>和List <k,v =“”>子类型作为参数

时间:2017-03-16 20:43:33

标签: java

我正在开发一个Java EE项目,我需要一个结构来将key-List<value>保存在RAM中。我创建了一个类似于这样的类:

public class ListMap<K, V> {
    private Map<K, List<V>> map;
    private Class<? extends List<V>> listClass;

    public ListMap(Class<? extends Map<K, List<V>>> mapClass, Class<? extends List<V>> listClass) throws InstantiationException, IllegalAccessException {
        this.map = mapClass.newInstance();
        this.listClass = listClass;
    }

    public void add(K key, V val) throws InstantiationException, IllegalAccessException {
        if (map.containsKey(key))
            map.get(key).add(val);
        else {
            List<V> valList = listClass.newInstance();
            valList.add(val);

            map.put(key, valList);
        }
    }

    public Map<K, List<V>> getMap() {
        return map;
    }

    public <T extends Map<K, List<V>>> T getMap(Class<T> cls) {
        return cls.cast(map);
    }

    public void setMap(Map<K, List<V>> map) {
        this.map = map;
    }
}

我尝试这样做:

ListMap<String, String> msgs = new ListMap<>(HashMap.class, ArrayList.class);

但是,它不起作用。任何人都可以告诉我如何实例化这个类?

1 个答案:

答案 0 :(得分:0)

我认为其中一个问题是您不能将泛型放在类声明中,例如HashMap<String, String>.class

这对你有用吗?

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ListMap<K, V> {
    private Map<K, List<V>> map;
    private Class<? extends List<V>> listClass;

    @SuppressWarnings("unchecked")
    public ListMap(Map<K, List<V>> map, List<V> listType) {
        this.map = map;
        this.listClass = (Class<? extends List<V>>) listType.getClass();
    }

    public void add(K key, V val) throws InstantiationException, IllegalAccessException {
        if (map.containsKey(key))
            map.get(key).add(val);
        else {
            List<V> valList = listClass.newInstance();
            valList.add(val);

            map.put(key, valList);
        }
    }

    public Map<K, List<V>> getMap() {
        return map;
    }

    public <T extends Map<K, List<V>>> T getMap(Class<T> cls) {
        return cls.cast(map);
    }

    public void setMap(Map<K, List<V>> map) {
        this.map = map;
    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        new ListMap<>(new HashMap<Integer, List<String>>(), new ArrayList<String>());
    }
}