Java泛型转换为通配符规则

时间:2018-08-07 15:40:56

标签: java generics wildcard

在简单的情况下,我可以轻松地从通用类型降级为通配符类型:

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

有没有一种方法可以进行编译?我是否错过了某种合乎逻辑的情况,那就是编译器正在保护我免受其侵害?为什么我不能转换内部类型?

1 个答案:

答案 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?

Java generics, nested collection of wildcard