在简单的情况下,我可以轻松地从通用类型降级为通配符类型:
List<Integer> intList = new ArrayList<>();
List<?> wildList = intList; // I can cast to a List<?>
但是,随着我的仿制药变得越来越复杂:
List<List<Integer>> nestedIntList = new ArrayList<>();
List<List<?>> nestedWildList = nestIntList; // This does not compile
有没有一种方法可以进行编译?我是否错过了某种合乎逻辑的情况,那就是编译器正在保护我免受其侵害?为什么我不能转换内部类型?
答案 0 :(得分:1)
List<Integer>
可分配给List<?>
或List<? extends Integer>
。同样,您可以将其分配给List<? extends Number>
,但不能分配给List<Number>
。
在类似的行上,您只能将List<List<Integer>>
分配给List<? extends List<?>>
请参阅:
Is List<Dog> a subclass of List<Animal>? Why are Java generics not implicitly polymorphic?