在Java中整数到字节转换

时间:2011-09-10 03:50:57

标签: java

在Java中我们可以做到

byte b = 5;    

但为什么我们不能将相同的参数传递给接受byte

的函数
myObject.testByte(5);
public void testByte (byte b)
{
  System.out.println("Its byte");
}     

它出现以下错误

The method testByte(byte) in the type Apple is not applicable for the arguments (int)
PS:可能是一个愚蠢的问题,我想我需要再次修改我的基础知识。

感谢。

6 个答案:

答案 0 :(得分:6)

硬编码的初始化值在Java中有些特殊 - 它们被假定为对您正在初始化的变量类型的强制。从本质上讲,第一部分代码实际上看起来像这样:

byte b = (byte) 5;

如果你这样做......

myObject.testByte((byte) 5);

...你不会得到那个错误,但如果你不这样做,那么5默认创建为int,而不是自动强制。

答案 1 :(得分:6)

原因是当你缩小基元时,你必须明确地进行转换 - 所以你承认可能会丢失数据。

为了说明,在投射5时没有丢失,因为该值在-128...127字节值范围内,但考虑更大的int值,比如说300 - 如果转换为byte,则必须丢弃一些位以使其适合8位。

该主题完整涵盖here

答案 2 :(得分:4)

通常情况下,不允许在没有明确演员的情况下将int转换为byte

但是,如果转换是赋值的一部分,并且该值是一个适合目标类型的静态已知常量,则编译器将自动执行转换。

section 5.2 of the JLS中描述了这种特殊行为。这是一个特殊情况,仅适用于转让;它不适用于其他环境中的转换。


现在我考虑一下,缺乏自动缩小参数可能是为了避免重载解决问题。如果我有方法#foo(short)#foo(char),则不清楚应该调用哪个foo(65)。你可以有特殊的规则来解决这个问题,但是在所有情况下都要求调用者是明确的更容易。

答案 3 :(得分:0)

您必须将参数5投射到方法byte中的testByte。 Java特别关注参数类型。

将其更改为:

myObject.testByte( (byte) 5);

答案 4 :(得分:0)

Java中的整数文字默认为int。在myObject.testByte(5); 5中是一个整数文字,将被视为int

众所周知,Java是严格的类型语言,因此不允许将int分配给byte。所有你需要有明确的类型转换。

答案 5 :(得分:0)

这是因为一个是赋值,一个是方法调用,并且在给定上下文的情况下它们的处理方式不同。在这种情况下,它是一个缩小的原始转换。

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html