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
?
答案 0 :(得分:5)
只是Double
。
非正式地,lub(null, Double)
是(一个不错的近似)包含null
类型和Double
类型的所有值的最具体类型,并且最具体的类型是{ {1}}。
正式地,我们可以在JLS section 4.10.4中处理Double
的定义,我们发现lub
是lub(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
的超类型。因此,Double
是Double
。