final byte b = 12;
Short s = b;
Integer i = b;
这个程序用Short编译没有问题,但是使用Integer编译时会出现"不兼容的类型"错误信息。
我很难理解这种情况。我在这种特定情况下找不到任何相关内容。
final byte b = 12;
Short s = b;
Integer i = b;
这个程序用Short编译没有问题,但是使用Integer编译时会出现"不兼容的类型"错误信息。
我很难理解这种情况。我在这种特定情况下找不到任何相关内容。
我尝试在更广泛的任务上下文中复制这个操作:
final byte b = 12;
Byte b2 = b;
Character c = b; // Only an error if b isn't final
char c2 = b; // Only an error if b isn't final
Short s = b; // Only an error if b isn't final
short s2 = b;
Integer i = b; // Error, as indicated in the question
int i2 = b;
Long l = b; // Also an error
long l2 = b;
Float f = b; // Also an error
float f2 = b;
Double d = b; // Also an error
double d2 = b;
Integer
,而且赋值给Float
、Long
或Double
也是错误的。
有趣的是,如果b
的原始声明不是final
,那么赋值给Character
、char
或Short
也会失败。
JLS第5.2节对赋值上下文及其允许的转换有所启示。Character
)进行赋值将失败。)接着说:如果变量的类型是byte、short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩小原始转换。
如果变量的类型是Byte,并且常量表达式的值可以表示为byte类型,则可以使用缩小原始转换后跟装箱转换。
如果变量的类型是Short,并且常量表达式的值可以表示为short类型,则可以使用缩小原始转换后跟装箱转换。
如果变量的类型是Character,并且常量表达式的值可以表示为char类型,则可以使用缩小原始转换后跟装箱转换。
b
是final
,表达式b
是一个常量表达式,允许将其从int
常量表达式12
缩小到byte
、char
或short
,然后装箱为Byte
、Character
或Short
,但奇怪的是,不能转换为Integer
或任何"以上"的类型。我能想到的唯一可能的解释是,受原始缩小转换影响的常量表达式不能被特别允许转换为Integer
、Long
、Float
或Double
。b
不是final
,那么缩小后再装箱是不允许的,非常量表达式也无法从byte
升级到char
。final
b
也会导致char c = b;
失败并出现错误。 - rgettmanInteger
或任何“更高级”的类型。我认为这是可以预料的,因为在那个时候,您正在使用Short
和Integer
,这些包装类型无法进行扩展。请参见$JLS 5.1.5:从任何引用类型S
到任何引用类型T
都存在扩展引用转换,前提是S
是T
的子类型。显然,Short
和Integer
之间没有直接联系。 - Jeroen Vannevel
Character c = b
也可以编译通过。但是char
是无符号的!那么当你把b
改成-12
时会发生什么呢?它就无法编译了! - Mark Peters