lub(null,Double)是什么?

时间:2017-04-19 21:03:41

标签: java types language-lawyer

JLS版本8中的

Table 15.25-B表示条件表达式的类型

true ? null : 0.0

lub(null,Double),其中lub似乎是来自section 4.10.4的一些疯狂难以理解的事情。

这似乎与Double类型有所不同,或者它们可能只是写了Double,就像它们在表格的其他地方所做的那样。但不清楚差异可能是什么。我尝试从第4.10.4节开始研究,但是当我到达关于

的部分时
  

让lub(U1 ... Uk)成为:

     

Best(W1)& ......&最好(WR)

似乎他们说这种类型是null和Double类型的交集类型,这没有任何意义。

什么是lub(null, Double)?具有此类型的条件表达式如何与其类型仅定义为Double

的行为不同

2 个答案:

答案 0 :(得分:5)

只是Double

非正式地,lub(null, Double)是(一个不错的近似)包含null类型和Double类型的所有值的最具体类型,并且最具体的类型是{ {1}}。

正式地,我们可以在JLS section 4.10.4中处理Double的定义,我们发现lublub(null, Double)

  

一组引用类型的最小上限或“lub”是a   共享超类型比任何其他共享超类型更具体   (也就是说,没有其他共享超类型是最低级别的子类型   界)。此类型lub(U1,...,Uk)的确定如下。

     

如果k = 1,那么lub就是类型本身:lub(U)= U。

     

否则:

     

对于每个Ui(1≤i≤k):

     

设ST(Ui)为Ui的超类型集。

ST(null) is the set of all reference types,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}。 (Double表示类型W <: V是类型W的子类型。类型被认为是其自身的子类型,因此它们指定W≠V以仅计算正确的子类型。)< / p>

  

对于通用类型的MEC的任何元素G:

     

[很多文字]

MEC不包含泛型类型,因此我们可以跳过此。

  

让lub(U1 ... Uk)成为:

     

Best(W1)&amp; ......&amp;最好(WR)

     

其中Wi(1≤i≤r)是MEC的元素,最小的擦除   U1的候选集...英国;

     

并且,如果这些元素中的任何一个是通用的,我们使用候选者   参数化(以便恢复类型参数):

     

Best(X)=候选人(X)如果X是通用的;否则X。

V在我们跳过的部分中定义;我们仍然可以跳过它,因为它只对通用类型有用。

lub(null,Double)是Best(Double),Best(Double)是Double,所以lub(null,Double)是Double。

答案 1 :(得分:3)

我相信lub(null, Double) === Double。不确定为什么要使用lub(null, Double)。也许允许将来改变 null类型的语义?

这是我的推理。根据定义,LUB = lub(T_1, ..., T_n),类型T_1,...,T_n的最小上界是一种类型,它是所有T_1,...,T_n的超类型,因此没有{{1}的正确子类型这也是所有T_1,...,T_n的超类型(即,它是最具体的类型同时是LUB的超类型。)

根据定义,T_1,...,T_n表达式的类型是 null类型。另外,根据定义,除 null类型之外的所有引用类型都是 null类型的直接超类型。

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