2010-09-09 37 views
5

据我所知,下面的代码将不工作Autoboxing /加宽发生在Short a = 3,但不在Float a = 3;

Float a=3 

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

1.

 `Short a=3;` 

这工作,但在这里,我们必须在LHS和RHS中Integer对象简短的参考。

2.

Float a=(Float) 3

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

+0

你有一个Java编译器?如果是这样,你可以试试这个。 – DJClayworth 2010-09-09 13:16:07

回答

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)并且工作。

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

(自动装箱,这就是为什么现代的IDE有多种选择来标记这些自动装箱为错误,我们可以用valueOf方法一样代替他们的内存更好的MGMT时的valueOf方法不使用)
+0

谢谢。非常清楚。 u能确认的话,那“浮动A = 3是行不通的,因为Java不允许强化通过自动装箱以下”。此外,自动装箱并不仅仅意味着为LHS调用适当的包装器构造函数。如果是这样,Float a = 3就可以工作。什么是必须发生的是,自动装箱前,一个缩小转换必须发生,使原始类型一样包装的基本类型,然后只自动装箱会发生。我在这里吗? – Daud 2010-09-18 10:55:10

1

简单形式为:

Float a=3.0f; 

双类型:

Double b=3.0; 
2

如果你的问题是“为什么浮动F = 3;没有编制,但短期S = 3;呢? “,那么答案是:

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

Short s = 3; 

被编译成

Short s = Short.valueOf(3); 

从本质上讲,当你写

short s = 3; 

相同奇迹发生,但这样做只为整数,而不是浮点值。

0

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

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