JLS:第 5.2 节分配转换(转换链)

  • 本文关键字:转换 分配 JLS java jls
  • 更新时间 :
  • 英文 :


我试图理解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;

因为这需要从 ComparableComparable<String> 的未经检查的转换,这不一定是坏事,除非

转换链包含两个不在 子类型关系

你本可以做到的

Comparable raw = comparableInteger;
Comparable<String> parameterized = raw;

这将使用未经检查的转换(当您尝试调用compareTo时,可能会在运行时使用ClassCastException)。但是,编译时没有问题,因为转换链只是

Comparable, Comparable<String>

这是允许的。

相关内容

最新更新