5

我了解以下代码不起作用

Float a=3

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

1.

     `Short a=3;`

这是可行的,虽然在这里,我们将在 LHS 上有一个 Short 引用,在 RHS 上有一个 Integer 对象。

2.

Float a=(Float) 3

如果我们没有对 3 进行类型转换,它将被翻译为 Integer.valueOf(3)。现在,它会被翻译成 Float.valueOf(3) 吗?

4

4 回答 4

2

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

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

Short s = 3;

编译为

Short s = Short.valueOf(3);

本质上,当你写作时,同样的魔法也会发生

short s = 3;

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

于 2010-09-12T19:02:02.753 回答
1

简短的形式是:

Float a=3.0f;

对于 Double 类型:

Double b=3.0;
于 2010-09-09T13:36:25.310 回答
0

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

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;
于 2010-09-17T20:15:31.253 回答
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)

于 2010-09-17T17:38:36.857 回答