use*_*ica 8 java types language-lawyer
JLS版本8中的表15.25-B表示条件表达式的类型
true ? null : 0.0
Run Code Online (Sandbox Code Playgroud)
是的lub(null,Double),4.10.4节lub似乎是一些疯狂的难以理解的事情.
这看起来与Double某种类型的类型不同,或者它们可能只是编写Double,就像它们在表中的其他地方所做的那样.但不清楚差异可能是什么.我试图从第4.10.4节开始研究它,但到了我接触到的部分时
让lub(U1 ... Uk)成为:
最佳(W1)&...&Best(Wr)
看起来他们说这种类型是null和Double类型的交集类型,这没有任何意义.
什么是lub(null, Double)?具有此类型的条件表达式与其类型刚刚定义为不同的行为有何不同Double?
这只是Double.
非正式地,lub(null, Double)是(最接近)包含null类型和Double类型的所有值的最特定类型,并且最具体的类型是Double.
形式上,我们可以通过定义工作lub在JLS 4.10.4节,我们发现lub(null, Double)是Double:
一组引用类型的最小上限或"lub"是共享超类型,其比任何其他共享超类型更具体(即,没有其他共享超类型是最小上限的子类型).这种类型的lub(U1,...,Uk)确定如下.
如果k = 1,则lub是类型本身:lub(U)= U.
除此以外:
对于每个Ui(1≤i≤k):
设ST(Ui)是Ui的超类型集合.
ST(null)是所有引用类型的集合,ST(Double)是{Object,Number,Double}.
让EST(Ui),Ui的一组被删除的超类型,是:
EST(Ui)= {| W | | ST(Ui)}中的W,其中| W | 是W的擦除
EST(null)是所有引用类型的擦除集,EST(Double)是{Object,Number,Double}.
设EC(U1 ... Uk的擦除候选集)是所有集合EST(Ui)(1≤i≤k)的交集.
EC是EST(null)和EST(Double)的交集,因此EC是{Object,Number,Double}.
让MEC,U1 ... Uk的最小擦除候选集,是:
MEC = {V | EC中的V,并且对于EC中的所有W≠V,情况不是W <:V}
MEC是EC中所有类型的集合,在EC中没有适当的子类型.Double是Number和Object的正确子类型,因此MEC = {Double}.(W <: V表示类型W是类型的子类型V.类型被认为是其自身的子类型,因此它们指定W≠V以仅计算适当的子类型.)
对于通用类型的MEC的任何元素G:
[很多文字]
MEC不包含泛型类型,因此我们可以跳过这个.
让lub(U1 ... Uk)成为:
最佳(W1)&...&Best(Wr)
其中Wi(1≤i≤r)是MEC的元素,U1 ... Uk的最小擦除候选集合;
如果这些元素中的任何一个是通用的,我们使用候选参数化(以便恢复类型参数):
最佳(X)=候选人(X)如果X是通用的; 否则X.
Candidate在我们跳过的部分中定义; 我们仍然可以跳过它,因为它只对通用类型有用.
lub(null,Double)是Best(Double),Best(Double)是Double,所以lub(null,Double)是Double.
我相信lub(null, Double) === Double。不确定为什么使用lub(null, Double). 也许允许将来更改null 类型的语义?
这是我的推理。根据定义,LUB = lub(T_1, ..., T_n)类型 T_1,...,T_n 的最小上界是所有 T_1,...,T_n 的超类型,因此没有适当的子类型LUB也是所有 T_1 的超类型, ...,T_n (即,它是最具体的类型,同时也是 的超类型T_1,...,T_n)。
根据定义,表达式的类型null是null 类型。同样根据定义,除null 类型之外的所有引用类型都是null 类型的直接超类型。
Double是null 类型的超类型。Double也是其自身的超类型,即Double类型。因此Double满足条件的是 all 的超类型T_1,...,T_n。另一方面,没有其他类型可以是 的正确子类型Double并且仍然是 的超类型Double。因此,Double是lub(null, Double).
| 归档时间: |
|
| 查看次数: |
481 次 |
| 最近记录: |