在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
。{
答案 0 :(得分:0)
这是我的想法。
符号[F1:=T1,...,Fn:=Tn]
是使用concete类型(或通配符)Fi
替换每个类型参数Ti, i=1,2,...n
。
通用类可以被视为具有(n+1)
参数f(F1,F2,...,Fn, S)
的函数,其中Fi
- 是类型参数,S
属于以下有限集{{1 }}。
如果我们用{B1,B2,...,Bn}
替换,我们得到一个参数的函数:
[F1:=T1,...,Fn:=Tn]
。
考虑g(s)=f(T1,T2,...,Tn,S)
是用[F1:=T1,...,Fn:=Tn]
代替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]
获取上限Bi
之一。
答案 1 :(得分:0)
我看起来不对劲。
首先:没有括号部分,句子是对前一个语句的正确重述,并且都符合我对java语言的理解。
第二:符号错了。 §4.10引用了子类型和超类型符号&lt ;:和:>,但实际使用的是替换符号:=(实际上未在版本8中定义为替换符号,但在版本7中,并在其他部分中用作替换符号)该文件)。
最后:JSL的早期版本具有更为荒谬的相同表示法版本。
具有一个的泛型类或接口声明C(第8.1.2节,第9.1.2节) 或更多类型参数A1,...,An具有相应的边界 B1,...,Bn定义了一组参数化类型,每种类型对应一种类型 调用类型参数部分。
集合中的每个参数化类型都是C形式 每个类型参数Ti的范围都是所有类型的子类型 在相应的边界中列出的类型。也就是说,对于每个绑定类型 Bi中的Si,Ti是Si的一个子类型[F1:= T1,...,Fn:= Tn]。
它有相同的括号,但这次甚至没有提到在括号中使用之前的F。
当在版本6和版本7之间重写此部分时,看起来括号被错误地复制。版本6具有括号,但简单的意思是对每个类型参数进行边界检查。