lub(null,Double)是什么?

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

use*_*ica 5

这只是Double.

非正式地,lub(null, Double)是(最接近)包含null类型和Double类型的所有值的最特定类型,并且最具体的类型是Double.

形式上,我们可以通过定义工作lubJLS 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.


Bru*_*eis 3

我相信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)。

根据定义,表达式的类型nullnull 类型。同样根据定义,除null 类型之外的所有引用类型都是null 类型的直接超类型。

Double是null 类型的超类型。Double也是其自身的超类型,即Double类型。因此Double满足条件的是 all 的超类型T_1,...,T_n。另一方面,没有其他类型可以是 的正确子类型Double并且仍然是 的超类型Double。因此,Doublelub(null, Double).