自动装箱/加宽发生在Short a = 3但不在Float a = 3;

时间:2010-09-09 12:47:18

标签: java casting autoboxing

我了解以下代码无效

Float a=3

因为它被翻译为Float a = Integer.valueOf(3)。我们将在LHS上有一个Float引用,在RHS上有一个Integer对象,它是不兼容的。但是:

1

     `Short a=3;`

这是有效的,虽然在这里,我们将对LHS和RHS上的整数对象进行简短引用。

2

Float a=(Float) 3

如果我们没有使用类型3,它将被翻译为Integer.valueOf(3)。现在,它会被翻译为Float.valueOf(3)吗?

4 个答案:

答案 0 :(得分:2)

如果您的问题是“为什么Float f = 3;不编译,但Short s = 3;是吗?”,那么答案是:

Java编译器对整数常量做了一些特殊工作,使它们适合左侧:它找到最合适的类型并使用它。所以,

Short s = 3;

编译为

Short s = Short.valueOf(3);

基本上,当你写

时会发生同样的魔术
short s = 3;

但这只适用于整数,而不适用于浮点值。

答案 1 :(得分:1)

简短形式是:

Float a=3.0f;

对于Double类型:

Double b=3.0;

答案 2 :(得分:0)

如果尝试使用大于它可以容纳的值来初始化变量(无论值的数字形式如何),编译器将给出错误消息。

char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value

请注意上面的代码中char,byte和short的最大十六进制值。如果超过这些值,编译器将自动使值为int,并告诉您需要缩小转换。你会知道你已经跨过了界限。

因此,在您的情况下Short s = 3实际上变为Short s = new Short(3)并且有效。 (自动装箱时不使用valueOf方法,因为现代IDE有选项将这些自动装箱标记为错误,我们可以用valueOf方法替换它们以获得更好的内存管理)

在第二种情况下,Float a=(Float) 3将成为Float.valueOf(3)

答案 3 :(得分:0)

无法指定短和字节常量,因此编译器允许您透明地转换int常量。 java中有浮点常量,因此它不支持隐含转换。如果你想浮点数/浮点数,我建议你使用浮点数常量。

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;