转换和促销

时间:2009-05-16 20:20:32

标签: java

我只是想知道为什么会这样(在Java中):

byte b = 27;

但是声明的方法如下:

public void method(byte b){
    System.out.println(b);
}

这不起作用:

a.method(27);

给出编译器错误如下:

`The method method(byte) in the type App is not applicable for the arguments (int)`

阅读this并没有给我任何线索(可能我对此有所了解)。

提前致谢。

4 个答案:

答案 0 :(得分:9)

分配的原因

byte b = 27;

作品归功于section 5.2 of the Java Language Specification(作业转换),其中包括:

  

此外,如果表达式是类型的常量表达式(第15.28节)   byteshortcharint

     

缩小的原始转换可能   如果变量的类型是,则使用   byteshortchar以及值{。}   常量表达式是   可代表的类型   变量

换句话说,该语言对此案例有特殊规定和作业。通常情况下,没有从intbyte的隐式转换。

有趣的是,C#在这方面的工作方式不同(尽管在核心功能的许多其他方面都像Java一样) - 方法调用在C#中有效。

答案 1 :(得分:1)

简单回答 - 一个字节是1个字节的内存,整数通常是4个字节。

如果没有明确地尝试将int强制转换为字节,则没有隐含的强制,因为如果缩小为一个字节,则大小为10790的整数将丢失信息。

答案 2 :(得分:0)

获取一个数值并在没有您的帮助的情况下将其转换为另一个数字值的过程称为促销 - 您将采用例如1个字节的数字,并通过填充零将其变为4个字节的数字。这通常是安全的,因为目标类型中的可能值范围大于源类型中的值。

当相反的情况发生时,例如取一个int并转换为一个字节,这是一个“降级”广告,它不是自动的,你必须强制它,因为它会失去价值。

这里发生的是27被解释为int。表达式本身是一个int,然后它被发送到一个需要一个字节的方法。换句话说,你将它放在一个接受一个字节的方法的调用内的事实并没有改变Java认为它有点开头的事实。

我不记得究竟如何在Java中定义字节常量,但一般来说,像27这样的数字是一个神奇的数字。你可能想写一个

final byte MY_CONSTANT_THAT_MEANS_27_BUT_WITH_MEANINGFUL_NAME = 27;

然后使用该常量而不是27来调用您的函数。

答案 3 :(得分:0)

默认情况下,Java会将数字值(例如27)视为整数类型。在类似的方面考虑这一点,如果你说123.45,它会看到它是一个浮点数,“你好”是一个字符串。这些是静态值,而不是变量,因此您需要转换为一个字节,如下所示:

a.method((byte)27);