2

在 JLS(参数化类型)的第 4.5 节中提到了以下符号: S[F1:=T1,...,Fn:=Tn].

我并不完全理解这个符号的含义。

在以下段落中提到:

泛型类型具有类型参数 F1,...,Fn 和对应的边界 B1,...,Bn。参数化类型的每个类型参数 Ti 的范围涵盖所有类型,这些类型是相应边界中列出的所有类型的子类型。也就是说,对于 Bi 中的每个绑定类型 S,Ti 是 S[F1:=T1,...,Fn:=Tn] 的子类型(第 4.10 节)。

上面这句话的意思很清楚。

[F1:=T1,...,Fn:=Tn]但我不清楚为什么我们有S

4

2 回答 2

0

对我来说只是看起来不对。

第一:没有括号部分,这句话是对前面陈述的正确重述,都符合我对java语言的理解。

第二:符号错误。§4.10 引用了子类型和超类型符号 <: 和 :>,但实际使用的是替换符号 :=(实际上在版本 8 中未定义为替换符号,但在版本 7 中,并在文档)。

最后:JSL 的早期版本有一个更荒谬的相同符号版本。

4.5. 参数化类型

具有一个或多个类型参数 A1,...,An 且具有相应边界 B1,...,Bn 的泛型类或接口声明 C(第 8.1.2 节、第 9.1.2 节)定义了一组参数化类型,一个对于类型参数部分的每个可能的调用。

集合中的每个参数化类型都是 C 形式,其中每个类型参数 Ti 的范围涵盖所有类型,这些类型是相应边界中列出的所有类型的子类型。也就是说,对于 Bi 中的每个绑定类型 Si,Ti 是 Si[F1:=T1,...,Fn:=Tn] 的子类型。

它有相同的括号,但这次甚至没有提到在括号中使用 F 之前是什么。

当本节在版本 6 和 7 之间重写时,看起来括号被错误地复制了。版本 6 有括号,但这只是意味着对每个类型参数进行边界检查。

于 2015-11-08T05:25:49.750 回答
0

这是我的想法。

表示法是用 concete type (or wildcard)[F1:=T1,...,Fn:=Tn]替换每个类型参数。FiTi, i=1,2,...n

泛型类可以被认为是一个带(n+1)参数的函数f(F1,F2,...,Fn, S),其中Fi- 是一个类型参数,S属于以下有限集{B1,B2,...,Bn}。如果我们[F1:=T1,...,Fn:=Tn]用一个参数替换我们得到的函数: g(s)=f(T1,T2,...,Tn,S).

考虑到这[F1:=T1,...,Fn:=Tn]是 with 的替换,Fi我们Ti, i=1,2,...,n 可以引入新的符号: f(T1,T2,...,Tn,S)=h(S)[F1=T1,...,Fn=Tn].

函数h(S)应该是线性的:h(S)=S

最后我们有: f(T1,T2,...,Tn,S)=S[F1=T1,...,Fn=Tn]

因此,概念意味着:获得固定值S[F1=T1,...,Fn=Tn]的上限之一。BiFi=Ti

于 2015-11-08T04:28:32.323 回答