gpt4 book ai didi

java - 是否可以泛化此功能?

转载 作者:行者123 更新时间:2023-11-30 06:19:58 27 4
gpt4 key购买 nike

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


  • 如果我想传入一个 dataItems和一个 Iterable<DataItem>在这里,我是不允许的,因为它们不匹配类型 IInterface并且集合不是协变的。

  • 如果我改变Map<String, List<IInterface>> target<? extends IInterface>那我就不能调用items.add(x);出于显而易见的原因位于底部。

  • 如果我将其更改为 <? super IInterface>然后函数很高兴,但我不能用 dataItems 调用它变量因为DerivedClass不是 IInterface 的父类(super class)。
  • 我能正常使用

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

关于java - 是否可以泛化此功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22481010/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com