You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:31:12