今天不知道哪根筋搭错了,写了个测试程序,很简单,希望进来的朋友帮忙解答一下!在java中整数类型有byte、short、int、long
在结构switch(表达式),表达式的值只能是int、byte、short、char问题1:为什么long型的数据不能作为switch中表达式的值,如果写个测试程序的话会报:精度可能丢失的错误。这个你可能说是java虚拟机内部就这个规定的,如果这个的话,那我们看下面的问题。
问题2:
public class JavaInt{
public static void main(String[] args){
byte b = 0;
short s = 1;
int i = 2;
long l = 3L;
int b1 = 0;
int s1 = 0;

switch(b){
case 0:
b1 = b + 1;
break;
case 1:
b1 = (int)(b + 2);
break;
case 2:
b1 = (int)(b + 3);
break;
case 3:
b1 = (int)(b + 4);
break;
default:
System.out.println("0===有错!");
}
System.out.println(b+"");

switch(s){
case 0:
s1 = s + 1;
break;
case 1:
s1 = (int)(s + 2);
break;
case 2:
s1 = (int)(s + 3);
break;
case 3:
s1 = (int)(s + 4);
break;
default:
System.out.println("1===有错!");
}
System.out.println(s+"");

switch(i){
case 0:
++i;
break;
case 1:
i = i + 2;
break;
case 2:
i = i + 3;
break;
case 3:
i = i + 4;
break;
default:
System.out.println("2===有错!");
}
System.out.println(i+"");

switch((int)l){
case 0:
++l;
break;
case 1:
l = l + 2;
break;
case 2:
l = l + 3;
break;
case 3:
l = l + 4;
break;
default:
System.out.println("3===有错!");
}
System.out.println(l+"");
}
}该测试程序的输出结果为:
0
1
5
7
但是我感觉结果应该是:
1
3
5
7
就实验结果来看,也就是说byte和short类型的数据没有进行运算,这是为什么?

解决方案 »

  1.   

    看在40分的份上,我说2句:
    你的第一跟第2个输出分别是 b跟 s,显然你想输出的是b1,s1,
      

  2.   

    我晕,这个是什么跟什么。
    b1 = b + 1;
    这个对b有什么影响?完全没有。除非你这样 b = (byte)(b+1);
    同理
    s1 = (int)(s+2);
    这个修改的只是s1的值,又不是s。你可以这样s+=2 或则s = (short)(s+2);
    i = i + 3;第三个开始正常了,不知道你前面是怎么想的
      

  3.   

    实际上switch只能是int类型,其他的short char byte之所以能够使用是因为其转换成了int
      

  4.   


    你的意思是,switch表达式中的之所以可以使用short char byte类型的值,是因为自动转型?但是很多书上都说:switch表达式中的值可以为short char byte int,如果上述是因为自动转型的话,那么对于long类型的数值来说同样可以通过强制类型转换啊,如果是这样的原因的话,教科书上也应该写switch表达式中的值可以为short char byte int long啊?
      

  5.   

    long类型不能自动转换为int型
    java底层是按32位计算的,可是short char byte 都不是32位的,所以计算这些类型的时候自动转换为int型。
    书上不可能跟你提到太过于复杂的内部问题,让你懂得究竟哪种类型可以就行了呗。
      

  6.   

    可以用枚举enum和switch搭配使用,达到你想要的switch(long)的效果。
    具体见Thinking in java 的第4(5?)章^^^^^^
      

  7.   

    long通过强制类型转换为int后,就不再是long,所以switch表达式中还是只能使用short char byte int类型的值
      

  8.   

    你的第一跟第2个输出分别是 b跟 s,显然你想输出的是b1,s1,还有,你上面类似的s1 = (int)(s+2);根本不需要强制转换。还有,你说的long问题,对于switch(),只有比int小的才能自动转换。比他大的当然得强制转换了。