Java 无法将泛型转换为扩展嵌套类型

Java 无法将泛型转换为扩展嵌套类型,java,generics,Java,Generics,最近我在重构一个泛型方法时遇到了一些无法解释的泛型转换问题。最后,我意识到我可以完全不用T类型(我自己直接内联),但我仍然好奇转换失败的原因。 我创建了这个最小的示例来说明这个问题 有人能解释一下转换失败的原因和解决方法吗? public <K, T extends List<K>> void castLists(List<T> list, K kForBinging) { Map<Integer, List<T>> map =

最近我在重构一个泛型方法时遇到了一些无法解释的泛型转换问题。最后,我意识到我可以完全不用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;
}
public void castLists(列表列表,K-kforbing){
Map Map=mapSizeToList(列表);
//类型不匹配:无法从映射转换为映射
//Map expandedMap=Map;
//接受回答后添加,合法转让:
Map lessSpecific=Map;
@抑制警告(“未选中”)
Map canCast=(Map)无特异性;
// ...
}
公共地图地图大小列表(列表){
Map Map=Maps.newHashMap();
// ...
返回图;
}

我相信你需要才能做这些事情Java似乎不支持这一点

i、 e在Java中,如果
T
List
的子类型,则并不意味着
List
List
的子类型,或者
Map
Map
的子类型。这就是分配出错的原因


协方差允许您这样做,因为使用它,如果模板参数具有子类-超类关系定义的类也将具有完全相同的关系
。这将使这项任务成为可能Scala(在其他(函数编程?)语言中)支持协方差及其补码反方差

,但是,List expandedLists=(List)List;是可转让的。但是我看到,不管是T.@ STIM,IM RuST在java中的绑定,C++中的绑定都是不安全的,事实上我理解了,不是故意的。如果要用
isinstanceof
检查类型,我希望它会返回false?在java中无法使用instanceof验证参数化类型。但是你是对的,这个赋值会引起编译器警告。谢谢@Karthik指出这个问题。在你的帮助下,我能够在没有演员阵容的情况下完成一项合法的任务,请再看问题。