Generics 是不是;使N的形式参数类型适应M的类型参数;是指类型系统的特定内容吗?

Generics 是不是;使N的形式参数类型适应M的类型参数;是指类型系统的特定内容吗?,generics,compiler-construction,implicit-conversion,language-design,type-systems,Generics,Compiler Construction,Implicit Conversion,Language Design,Type Systems,我试图100%地探索Java语言规范(JLS)在以下方面的含义:“…将N的形式参数类型调整为m的类型参数…” 顺便说一句,我的最佳猜测是,在该上下文中“适应”意味着“做点什么使方法的形式参数与为该方法声明的泛型类型参数兼容” 我对JLS进行了一次很好的搜索。但这并不能解释这个短语的确切含义 因此,我推测JLS假设沉浸在类型系统领域的人们——语言设计者、编译器实现者等——已经知道“适应形式参数类型”的更具体、更技术的含义 这里有谁能准确地解释一下“…使N的形式参数类型适应M的类型参数”用外行的话来

我试图100%地探索Java语言规范(JLS)在以下方面的含义:“…将
N
的形式参数类型调整为
m
的类型参数…”

顺便说一句,我的最佳猜测是,在该上下文中“适应”意味着“做点什么使方法的形式参数与为该方法声明的泛型类型参数兼容”

我对JLS进行了一次很好的搜索。但这并不能解释这个短语的确切含义

因此,我推测JLS假设沉浸在类型系统领域的人们——语言设计者、编译器实现者等——已经知道“适应形式参数类型”的更具体、更技术的含义

这里有谁能准确地解释一下“…使
N
的形式参数类型适应
M
的类型参数”用外行的话来说意味着什么


TIA.

我被JLS的通用方法部分中一个措辞模糊的要点弄得头晕目眩

但在反复阅读了这两个版本之后,我最终发现,这个神秘的要点最有可能谈论的是lambda演算中所称的“或”α转换:

“…α-转换,有时称为α-重命名,允许更改绑定变量名称。例如,λx.x的α-转换可能产生λy.y。仅通过α-转换不同的项称为α-等价项。通常,在使用lambda演算时,α-等价项被视为等价项…”

因此:

其中A1,…,An是M和B1的类型参数, …,Bn是N的类型参数, 设θ=[B1:=A1,…,Bn:=An]。 那么,尽管我(1≤ 我≤ n) 的边界 Ai与θ的类型相同,θ应用于 毕。

将此方法取为
M

然后,“将
N
类型中出现的
Bi
重命名为
Ai
”意味着将该θ函数应用于每个类型参数;每个相应的
i
位置彼此锁定

对我帮助最大的是,类型参数的顺序位置在θ函数的应用中是非常非常重要的

当θ函数应用于
B3
的上限时,发生的情况是
extends T
必须类似地α-重命名为
extends U
,以便上限的类型参数与其在索引
2
处重命名的类型参数同步:

          +------------------------------+
          ¦    1    ¦    2    ¦    3     ¦
+---------+---------+---------+----------+------------+
|    M    |    T    |    U    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    N    |    U    |    T    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    θ    |    T    |    U    |    V     | extends U  |
+-----------------------------------------------------+
结果是:示例方法
M
N
的签名不相同。是的,它们具有相同的名称(
M
)。是的,它们具有相同数量的类型参数。甚至它们的类型参数也已重命名为相同的,并且顺序相同。但kicker是,它们在索引3处对应的类型参数具有不同的上限


这就是JLS所说的“为所有i(1≤ 我≤n) ,
Ai
的界与应用于
Bi
的界的θ的类型相同。记得你先在这里听到的;)

它让我非常恼火,以至于JLS的通用方法部分中的一个含糊不清的要点对我来说太模糊了

但在反复阅读了这两个版本之后,我最终发现,这个神秘的要点最有可能谈论的是lambda演算中所称的“或”α转换:

“…α-转换,有时称为α-重命名,允许更改绑定变量名称。例如,λx.x的α-转换可能产生λy.y。仅通过α-转换不同的项称为α-等价项。通常,在使用lambda演算时,α-等价项被视为等价项…”

因此:

其中A1,…,An是M和B1的类型参数, …,Bn是N的类型参数, 设θ=[B1:=A1,…,Bn:=An]。 那么,尽管我(1≤ 我≤ n) 的边界 Ai与θ的类型相同,θ应用于 毕。

将此方法取为
M

然后,“将
N
类型中出现的
Bi
重命名为
Ai
”意味着将该θ函数应用于每个类型参数;每个相应的
i
位置彼此锁定

对我帮助最大的是,类型参数的顺序位置在θ函数的应用中是非常非常重要的

当θ函数应用于
B3
的上限时,发生的情况是
extends T
必须类似地α-重命名为
extends U
,以便上限的类型参数与其在索引
2
处重命名的类型参数同步:

          +------------------------------+
          ¦    1    ¦    2    ¦    3     ¦
+---------+---------+---------+----------+------------+
|    M    |    T    |    U    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    N    |    U    |    T    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    θ    |    T    |    U    |    V     | extends U  |
+-----------------------------------------------------+
结果是:示例方法
M
N
的签名不相同。是的,它们具有相同的名称(
M
)。是的,它们具有相同数量的类型参数。甚至它们的类型参数也已重命名为相同的,并且顺序相同。但kicker是,它们在索引3处对应的类型参数具有不同的上限

这就是JLS所说的“为所有i(1≤ 我≤n) ,t
          +------------------------------+
          ¦    1    ¦    2    ¦    3     ¦
+---------+---------+---------+----------+------------+
|    M    |    T    |    U    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    N    |    U    |    T    |    V     | extends T  |
+---------+---------+---------+----------+------------¦
|    θ    |    T    |    U    |    V     | extends U  |
+-----------------------------------------------------+
<A, B, C extends Number> void dedupersConfusion() {}
<D, E, F extends Number> void dedupersConfusion() {}
<U> void dedupersConflation() {}
void dedupersConflation(U var) {}
<U> void dedupersConfusion(U x) {}
<U extends String> void dedupersConfusion(U x) {}
<U extends Number> void dedupersConfusion(U x) {}
<U extends Number> void dedupersConfusion(U x) {}
<U extends Number> void dedupersConfusion(U x) {}