发现了Java中的一个bug; byte竟然不能 接收整形?

CielSwift 发布于 10/23 09:05
阅读 1K+
收藏 0
void setStatus(Byte status){

}

    setStatus(1);

报错,不能接受int类型的值

加载中
1
tcxu
tcxu

整型 int 数据的取值范围:[-2147483648,2147483647]
字节型 byte 数据的取值范围:[-128,127]
方法 static void setStatus(Byte status)需要字节型 byte 的参数。
1 表示(默认)整型数据。(byte) 1 则表示字节型的数据。 因此,调用此方法的整型参数(比如 1),必须表明(转换)成字节型参数((byte)1),

public class T {
	static void setStatus(Byte status){
		System.out.println("状态: " + status);
}
public static void main(String args[]){
		System.out.println("整型[" + Integer.MIN_VALUE + "," + Integer.MAX_VALUE + "]");
		System.out.println("字节型[" + Byte.MIN_VALUE + "," + Byte.MAX_VALUE + "]");
	    setStatus((byte)1);
	}
}

输出:

整型[-2147483648,2147483647]
字节型[-128,127]
状态: 1

 

isscy
isscy
真假?
0
whaon
whaon
whaon
回复 @水表 : 哈哈,我的锅
水表
少打一个b,看了一会我寻思java里好像没有yte这个型啊。
0
KevinBlandy
KevinBlandy

卧槽。。。赶紧给Oracle提交这BUG。

0
JavaGG
JavaGG

卧槽。。。赶紧给Oracle提交这BUG。

0
aqu
aqu
setStatus(11B);

这样不行么?

0
stsjs1218
stsjs1218

当然不行啊   int的范围比byte大

如果传入的int值不在byte的[-128,127]范围内 是有问题的

所以不能接收是合理的

同理 short也不能接收int    int不能接收long一样

0
随心OS

java里面 数字 默认就是整型,如果赋值给long会自动转型会long,但是赋值给比int小的 都会报错。一个道理,float a=1.1也会报错。因为小数默认就是double类型。

0
rz
rz

你去看看C/C++的隐式类型转换就明白为什么 Java的byte不支持int赋值了

0
前端大师傅
前端大师傅

楼上的朋友说得都很对,但是这些答案都是片面的。

真正的原因是原因。1是字面量。字面量是有自己的类型声明的。

很多人有这样的误解:int i=0;以为int 是定义了右边零的类型,其实是错误的。

而这里0不加任何后缀的时候是整型,然后左边的变量名i也是整型所以不会溢出。

而如果把左边的改成byte i =0 这时是则是可能会溢出,当然一般语言会作隐式数据转换

注意这里右边的0的长度是int型,在java里面没有在jre底层处理

隐式转换所以楼主会有这样的误会。

正确的做法是byte i = (byte)0;

 

返回顶部
顶部