gpt4 book ai didi

java - 无法将泛型转换为扩展的嵌套类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:12 26 4
gpt4 key购买 nike

最近我在重构一个通用方法时遇到了无法解释的通用转换问题。最后我意识到我可以完全不使用 T 类型(我自己将其内联),但我仍然很好奇转换失败的原因。我创建了这个最小示例来说明这个问题。

有人能解释一下为什么转换失败而解决方法有效吗?

public <K, T extends List<K>> void castLists(List<T> list, K kForBinging) {
Map<Integer, List<T>> map = mapSizeToList(list);
// Type mismatch: cannot convert from Map<Integer,List<T>> to Map<Integer,List<List<K>>>
// Map<Integer, List<List<K>>> expandedMap = map;

// Added after accepting answer, legal assignment:
Map<Integer, ? extends List<? extends List<K>>> expandedMap = map;

// Originally proposed 'work around'
Map<Integer, ?> lessSpecific = map;
@SuppressWarnings("unchecked")
Map<Integer, List<List<K>>> canCast = (Map<Integer, List<List<K>>>)lessSpecific;
// ...
}

public <A> Map<Integer, List<A>> mapSizeToList(List<A> list) {
Map<Integer, List<A>> map = Maps.newHashMap();
// ...
return map;
}

最佳答案

我相信你需要 Covariance with generics 在你可以做这样的事情之前。 Java 似乎不支持

即在 Java 中,如果 TList<K> 的子类型,它并不暗示 List<T>List<List<K>> 的子类型或者那个Map<Integer,List<T>>Map<Integer, List<List<K>>> 的子类型.这就是分配错误的原因。

Covariance 允许您这样做,因为有了它,如果模板参数具有子类-父类(super class)关系定义的类也将具有完全相同的关系。这将使这项任务成为可能。 Scala(以及其他(函数式编程?)语言)支持协变及其补充逆变

关于java - 无法将泛型转换为扩展的嵌套类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969435/

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