Java允许缩小引用转换

Java允许缩小引用转换,java,types,type-conversion,subtyping,Java,Types,Type Conversion,Subtyping,我正在参考JLS()的第5.1.6.1节 在第2点,它说“如果存在一个参数化类型X是T的超类型,而一个参数化类型Y是S的超类型,那么X和Y的擦除是相同的,那么 X和Y不可证明是不同的” 现在,让我们假设T:=List,s:=List,我们写T=s,这会导致编译错误。但这与上述说法不符。如果我们选择X:=List,它是List的参数化类型和超类型,并且我们选择Y:=List,那么X和Y的擦除是相同的(List) 我在哪里误解了这条规则?是的,我也读过,并认为这是引用的一种暗示。他们的例子可以总结为

我正在参考JLS()的第5.1.6.1节

在第2点,它说“如果存在一个参数化类型X是T的超类型,而一个参数化类型Y是S的超类型,那么X和Y的擦除是相同的,那么 X和Y不可证明是不同的”

现在,让我们假设
T:=List
s:=List
,我们写
T=s,这会导致编译错误。但这与上述说法不符。如果我们选择
X:=List
,它是
List
的参数化类型和超类型,并且我们选择
Y:=List
,那么
X
Y
的擦除是相同的(
List


我在哪里误解了这条规则?

是的,我也读过,并认为这是引用的一种暗示。他们的例子可以总结为:如果S和T是可证明不同的,则不允许缩小参考转换。但是,他们制定了引用的规则,我无法将其放在一起。列表是列表的直接超类型,因为类型参数“?”包含类型参数“Object”(参见4.5.1)。
List
不是
List
@user85421的子类型确实如此。您只需要应用子类型的规则。规范并没有说您可以选择适合您情况的任意X和Y组合。它说“如果存在……那么……”定义了一个必须始终保持的条件(对于所有现有的X和Y)。