关于JLS 18.3.2捕获转换边界中R的含义及示例问询
关于JLS 18.3.2《涉及捕获转换的边界》中类型R的解析与示例
一、类型R的定义与“非推断变量但未必是proper type”的解释
首先明确两个核心定义:
- Proper Type(JLS 18.1.1):指不含未绑定类型变量、通配符的具体类型,或是捕获转换生成的捕获变量(捕获变量属于proper type,因为它是被明确绑定到具体类型范围的临时变量)。
- 类型R(JLS 18.3.2):是捕获转换处理通配符时,从通配符的上/下界中提取的类型。它不是类型推断过程中专门引入的推断变量,但可能包含未绑定的类型变量,因此未必是proper type——这和proper type的定义不存在矛盾:如果R包含未绑定的类型变量(比如
List<T>中的List<T>,T是未绑定的类型变量),它就不符合proper type的要求,但它本身不是用于类型推断的推断变量,完全符合R的定义。
简言之,R是通配符边界里的“原始参考类型”,可能带未解析的类型变量,但不是推断阶段的临时变量。
二、各类边界集合的代码示例
1. αᵢ = R(相等边界)
αᵢ是捕获转换生成的捕获变量,R是与αᵢ完全等价的类型。示例:
// 场景1:通配符无显式边界,实际赋值为具体类型 List<?> strList = new ArrayList<String>(); // 捕获转换后,捕获变量αᵢ代表String,此时αᵢ = String(R=String) // 场景2:通配符指定上界,实际赋值恰好为该上界类型 List<? extends Integer> intList = new ArrayList<Integer>(); // 捕获转换后,捕获变量αᵢ代表Integer,此时αᵢ = Integer(R=Integer)
2. αᵢ <: R(子类型边界)
捕获变量αᵢ是R的子类型,即αᵢ继承/实现了R。示例:
class Animal {} class Cat extends Animal {} // 通配符指定上界为Animal,实际赋值为Cat的集合 List<? extends Animal> animalList = new ArrayList<Cat>(); // 捕获转换后,捕获变量αᵢ代表Cat,此时Cat <: Animal(R=Animal),符合αᵢ <: R的边界 // 接口场景示例 interface List<E> extends Collection<E> {} Collection<? extends List<String>> coll = new ArrayList<ArrayList<String>>(); // 捕获转换后,αᵢ代表ArrayList<String>,R是List<String>,满足αᵢ <: R
3. R <: αᵢ(超类型边界)
R是捕获变量αᵢ的子类型,即αᵢ是R的超类型。示例:
class Animal {} class Cat extends Animal {} // 通配符指定下界为Cat,实际赋值为Animal的集合 List<? super Cat> catList = new ArrayList<Animal>(); // 捕获转换后,捕获变量αᵢ代表Animal,此时Cat <: Animal(R=Cat),符合R <: αᵢ的边界 // 包装类场景示例 List<? super Integer> numList = new ArrayList<Number>(); // 捕获转换后,αᵢ代表Number,R是Integer,Integer <: Number,满足R <: αᵢ
内容的提问来源于stack exchange,提问作者user24723440
相关产品推荐
相关产品推荐

