由于Java中的协方差规则,我在创建此通用函数时遇到了麻烦。我知道我可以使用通配符并执行List<? extends/super T>。我只是看不到它如何适用于这种情况。




如果我想在此处传递dataItemsIterable<DataItem>,则不允许这样做,因为它们与IInterface类型不匹配,并且集合不是协变量。
如果将Map<String, List<IInterface>> target更改为<? extends IInterface>,则出于明显原因,我无法在底部调用items.add(x);
如果将其更改为<? super IInterface>,则该函数很高兴,但是我无法使用dataItems变量来调用它,因为DerivedClass不是IInterface的超类。
我可以正确使用




//DerivedClass implements IInterface which provides getId().
private Map<String, List<DerivedClass>> dataItems;
private Map<String, List<OtherDerivedClass>> otherDataItems;

private void populate(Map<String, List<IInterface>> target,
         Iterable<? extends IInterface> source) {
    for (final IInterface x : source) {
        List<IInterface> items = target.get(x.getId());
        if (items == null) target.put(x.getId(),
            new ArrayList<IInterface>(){{add(x);}});
        else items.add(x);
    }
}




问题:如何修改此功能以使其生效,还是应该在此处更改基本设计?

最佳答案

您是否尝试过为整个方法声明通用类型参数?就像是:

private <I extends IInterface> void populate(Map<String, List<I>> target, Iterable<I> source)

10-02 07:47