0
 public class people {

}

class friend extends people {

}

class coworkers extends people {

}

class family extends people {

}

public void fillMaps(){
    ConcurrentMap<String, Collection<family>> familyNames = new ConcurrentHashMap<String, Collection<family>>();
    ConcurrentMap<String, Collection<coworkers>> coworkersNames = new ConcurrentHashMap<String, Collection<coworkers>>();
    ConcurrentMap<String, Collection<friend>> friendNames = new ConcurrentHashMap<String, Collection<friend>>();
    populateMap(family.class, familyNames);
    populateMap(coworkers.class, coworkersNames);
    populateMap(friend.class, friendNames);
}

private <T> void populateMap(Class<T> clazz, ConcurrentMap<String, Collection<people>> map) {
        if (clazz == family.class) {
            map.put("example", new ArrayList<family>());
        }
        if (clazz == coworkers.class) {
            map.put("example", new ArrayList<coworkers>());
        }
        if (clazz == friend.class) {
            map.put("example", new ArrayList<friend>());
        }

}

家族、同僚、友人のクラスはすべて、ピープルと呼ばれるスーパークラスから拡張されています。以下のメソッドでは、クラスを populateMap メソッドのパラメーターへの引数として使用できないのはなぜですか。また、ここでサブクラス コレクションを引数として渡すことができないのはなぜですか?

error:
The method populateMap(Class<T>, ConcurrentMap<String,Collection<people>>) is not applicable for the arguments (Class<family>, ConcurrentMap<String,Collection<family>>)
4

3 に答える 3

3

ArrayList<family>はサブタイプと見なされないため、Collection<people>割り当てることができません。の概念はPolymorphism、クラスと同じように Java ジェネリックには適用されません。

private <T> void populateMap(ConcurrentMap<String, Collection<T>> map) {
    map.put("example", new ArrayList<T>());
}
于 2013-06-19T16:52:38.337 に答える
3

ArrayList<family>Collection<people> ArrayList<family>のサブタイプのサブタイプのサブCollection<family> ArrayList<people>タイプとは見なされませんCollection<people>

あなたはこれが欲しい

private <T extends people> void populateMap(ConcurrentMap<String, Collection<T>> map) {

                map.put("example", new ArrayList<T>());


    }
于 2013-06-19T16:54:48.077 に答える
0

使用する

private <T> void populateMap(Class<T> clazz, ConcurrentMap<String, Collection<? extends people>> map) {
...
}

Collection<family>Collection<? extends people>as familyextendsに対して有効である必要がありますpeople。しかし、それはおそらくあなたが望むものではありません.Rahulの答えはおそらくあなたが望むものです.

于 2013-06-19T16:56:14.493 に答える