2017-03-16 5 views
0

私はkey-List<value>をRAMに保存するための構造が必要なJava EEプロジェクトに取り組んでいます。私はこのようにそれをやってみましたJava 8:マップ<K, V>とリスト<K, V>のサブタイプをパラメータとして渡す方法

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); 

しかし、その動作していない私は、次のようになりますクラスを作成しました。誰でもこのクラスをどのようにインスタンス化できますか教えてください。

+0

Java 8を使用していますか?また、 "_not working_"を定義する - 完全なコンパイルエラーまたはスタックトレースをポストする。 –

+0

'mapClass'を渡す必要はありません。既にビルドされた' Map'を渡すだけです。 –

+0

@BoristheSpider、yup –

答えて

0

私は問題の1つは、クラス宣言にジェネリックスを入れることができないと思います。 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>()); 
    } 
} 
関連する問題