等效于变量声明的通用方法

时间:2019-07-08 11:55:56

标签: java generics

我想知道为什么在Java中无法做到这一点:

private <T> Map<Class<T>, List<T>> map;

由于不可能,我必须使用原始类型来声明地图,如下所示:

private Map<Class, List> map;

此声明有两个主要问题:

  1. 我可以自由地将想要的Class和任何List放在地图上。
  2. 因此,每当我使用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>不是我想要的。这将迫使我的地图中的每个键都具有相同的泛型类型。我只想确保键具有与其映射值相同的泛型。

0 个答案:

没有答案