开发者社区> 问答> 正文

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

void setStatus(Byte status){

}

    setStatus(1);

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

展开
收起
爱吃鱼的程序员 2020-06-05 15:02:59 622 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>整型 int 数据的取值范围:[-2147483648,2147483647]<br> 字节型 byte 数据的取值范围:[-128,127]<br> 方法 static void setStatus(Byte status)需要字节型 byte 的参数。<br> 1 表示(默认)整型数据。(byte) 1 则表示字节型的数据。 因此,调用此方法的整型参数(比如 1),必须表明(转换)成字节型参数((byte)1),</p> 
    
    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

     

                            真假?
                        
    
                        <p>(yte)1</p>
                    
    
                            回复 <a class="referer" target="_blank">@水表</a>  : 哈哈,我的锅
                        
    
                            少打一个b,看了一会我寻思java里好像没有yte这个型啊。
                        
    
                        <p>卧槽。。。赶紧给Oracle提交这BUG。</p>
                    
    
                        <p>卧槽。。。赶紧给Oracle提交这BUG。</p>
                    
    
                        <p>转成int 家static</p>
                    
    
                        <pre>setStatus(11B);</pre> 
    

    这样不行么?

                        <p>当然不行啊   int的范围比byte大</p> 
    

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

    所以不能接收是合理的

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

                        <p>java里面 数字 默认就是整型,如果赋值给long会自动转型会long,但是赋值给比int小的 都会报错。一个道理,float a=1.1也会报错。因为小数默认就是double类型。</p>
                    
    
                        <p>你去看看C/C++的隐式类型转换就明白为什么 Java的byte不支持int赋值了</p>
                    
    
                        <p>楼上的朋友说得都很对,但是这些答案都是片面的。</p> 
    

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

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

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

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

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

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

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

     

    2020-06-05 15:50:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载