在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:可能是一个愚蠢的问题,我想我需要再次修改我的基础知识。
感谢。
答案 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