我想知道为什么在Java中无法做到这一点:
private <T> Map<Class<T>, List<T>> map;
由于不可能,我必须使用原始类型来声明地图,如下所示:
private Map<Class, List> map;
此声明有两个主要问题:
Class
和任何List
放在地图上。get(Class<T>)
来检索列表时,我都会检索List
而不是List<T>
。 这是一个具体的例子:
public class PropertyAlterationManager {
private Map<Class, AlterationPack> alterations;
public PropertyAlterationManager() {
this.alterations = new HashMap<>();
}
public <T, R> void addCancellerFor(Class<? extends OverallMergeProperty<T, R>> clazz, CalculationCanceller<T, R> alteration) {
if(alterations.containsKey(clazz)) {
AlterationPack<T, R> pack = (AlterationPack<T, R>) alterations.get(clazz);
pack.cancellers.add(alteration);
} else {
List<IOCalculationModifier<T>> modifiers = new ArrayList<>();
List<CalculationCanceller<T, R>> cancellers = new ArrayList<>();
cancellers.add(alteration);
this.alterations.put(clazz, new AlterationPack<>(modifiers, cancellers));
}
}
private static class AlterationPack<T, R> {
private List<IOCalculationModifier<T>> modifiers;
private List<CalculationCanceller<T, R>> cancellers;
private AlterationPack(List<IOCalculationModifier<T>> modifiers, List<CalculationCanceller<T, R>> cancellers) {
this.modifiers = modifiers;
this.cancellers = cancellers;
}
}
}
如您所见,即使我100%确保它不会引发任何ClassCastException,我也必须在此行unchecked cast
上执行AlterationPack<T, R> pack = (AlterationPack<T, R>) alterations.get(clazz);
。实际上,地图只能按照以下内容在此类中填充:
List<IOCalculationModifier<T>> modifiers = new ArrayList<>();
List<CalculationCanceller<T, R>> alterations = new ArrayList<>();
alterations.add(alteration);
this.alterations.put(clazz, new AlterationPack<>(modifiers, alterations));
还有其他解决方案可以解决此问题吗?对我而言,泛型的目的是避免强制转换...而我被迫做一个(或进行未经检查的泛型转换)
由于人们似乎已经误解了我的问题:不,让这样的类通用:public class PropertyAlterationManager<T, R>
不是我想要的。这将迫使我的地图中的每个键都具有相同的泛型类型。我只想确保键具有与其映射值相同的泛型。