我试图理解JLS的例子。
本节内容如下:
如果转换链包含两个不在子类型关系中的参数化类型,则会出现编译时错误。
这种非法链的一个例子是:
Integer, Comparable<Integer>, Comparable, Comparable<String>
链的前三个元素通过加宽相关 引用转换,而最后一个条目派生自其 前置未经检查的转换。但是,这不是有效的 赋值转换,因为链包含两个参数化 类型,
Comparable<Integer>
和Comparable<String>
,不是 亚。
我们猫在什么条件下得到这条链条?有人可以举一些更详细的例子吗?
我已经理解了它。
赋值上下文适用于赋值表达式。
在表达式中
Integer integerValue = 42;
Comparable<Integer> comparableInteger = integerValue;
整数文本42
可以通过装箱转换分配给类型 Integer
的变量。可以通过扩大引用转换将 Integer
类型的值分配给类型 Comparable<Integer>
的变量。
在以下表达式中
Comparable raw = comparableInteger;
可以通过扩大引用转换将 Comparable<Integer>
类型的值分配给类型 Comparable
的变量。
但你不能做
Comparable<String> comparableString = integerValue;
因为这需要从 Comparable
到 Comparable<String>
的未经检查的转换,这不一定是坏事,除非
转换链包含两个不在 子类型关系
你本可以做到的
Comparable raw = comparableInteger;
Comparable<String> parameterized = raw;
这将使用未经检查的转换(当您尝试调用compareTo
时,可能会在运行时使用ClassCastException
)。但是,编译时没有问题,因为转换链只是
Comparable, Comparable<String>
这是允许的。