Java泛型使用通配符时的类型推断规则探究
通配符目标类型下的ArrayList菱形语法类型推断
当使用菱形语法new ArrayList<>()且目标类型包含通配符时,编译器会基于通配符的约束选择最合理的实际类型参数,以下是两种场景的具体推断逻辑:
1. 目标类型为ArrayList<? super Number>
编译器会推断Number作为ArrayList的实际类型参数,等价于:
ArrayList<? super Number> list1 = new ArrayList<Number>();
原因:? super Number是下界通配符,允许的类型是Number或其父类。编译器会选择最具体的符合约束的类型(即下界本身Number),这样既满足目标类型的通配符要求,又能最大化后续操作的灵活性——比如可以向list1中添加Number及其子类的实例。
2. 目标类型为ArrayList<? extends Number>
编译器会推断Number作为ArrayList的实际类型参数,等价于:
ArrayList<? extends Number> list2 = new ArrayList<Number>();
原因:? extends Number是上界通配符,允许的类型是Number或其子类。编译器会选择最宽泛的符合约束的类型(即上界本身Number),这样实例既能适配目标类型的通配符约束,又能兼容对所有Number子类元素的读取操作(虽然通配符本身限制了添加操作,但推断的类型保证了实例的最大适配范围)。
内容的提问来源于stack exchange,提问作者Priyshrm
相关产品推荐
相关产品推荐

