只是Double
.
非正式地,lub(null, Double)
是(一个不错的近似)包含所有值的最具体类型null
类型和Double
类型,最具体的类型是Double
.
形式上,我们可以通过定义lub
in JLS 第 4.10.4 节 https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10.4,我们发现lub(null, Double)
is Double
:
一组引用类型的最小上限或“lub”是
比任何其他共享超类型更具体的共享超类型
(也就是说,没有其他共享超类型是最小上层的子类型
边界)。该类型 lub(U1, ..., Uk) 确定如下。
如果 k = 1,则 lub 就是类型本身:lub(U) = U。
否则:
对于每个 Ui (1 ≤ i ≤ k):
令 ST(Ui) 为 Ui 超类型的集合。
ST(null)是所有引用类型的集合 https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10.2,ST(Double) 是 {Object, Number, Double}。
令 EST(Ui)(Ui 的已擦除超类型集合)为:
EST(Ui) = { |W| | W in ST(Ui) } 其中 |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 中没有适当子类型的所有类型的集合。 Double 是 Number 和 Object 的真子类型,因此 MEC = {Double}。 (W <: V
意味着类型W
是该类型的子类型V
。类型被视为其自身的子类型,因此它们指定 W ≠ V 以仅计算正确的子类型。)
对于 MEC 的任何泛型类型元素 G:
[大量文字]
MEC 不包含泛型类型,因此我们可以跳过这一点。
设 lub(U1 ... Uk) 为:
最佳(W1) & ... & 最佳(Wr)
其中 Wi (1 ≤ i ≤ r) 是 MEC 的元素,最小擦除
U1 ... Uk 的候选集;
如果这些元素中的任何一个是通用的,我们使用候选元素
参数化(以便恢复类型参数):
如果 X 是通用的,则 Best(X) = Candidate(X);否则 X。
Candidate
在我们跳过的部分中定义;我们仍然可以跳过它,因为它只对泛型类型重要。
lub(null, Double) 是 Best(Double),而 Best(Double) 是 Double,因此 lub(null, Double) 是 Double。