Cast object (type double) to int

前端 未结 3 1325
北海茫月
北海茫月 2020-12-11 08:31

Okay, so if I have this code

double a=1.5;
int b=(int)a;
System.out.println(b);

Everything works fine, but

Object a=1.5;
in         


        
相关标签:
3条回答
  • 2020-12-11 08:58

    When you're casting from Object, you're unboxing from the wrapper type... and you can only unbox to the original type, basically. It's effectively a cast to the relevant wrapper type, followed by a call to the appropriate xxxValue method. So this:

    Object x = ...;
    double d = (double) x;
    

    is equivalent to:

    Object x = ...;
    double d = ((Double) x).doubleValue();
    

    That cast to Double will obviously fail if x isn't a reference to a Double.

    So your problematic code is equivalent to:

    Object a = Double.valueOf(1.5); // Auto-boxing in the original code
    int b = ((Integer) a).intValue(); // Unboxing in the original code
    System.out.println(b);
    

    Hopefully now it's obvious why that would fail - because the first line creates a Double which you're then trying to cast to Integer.

    0 讨论(0)
  • 2020-12-11 09:12

    I am not sure why your code works at all. You should not be able to cast Object to 'double' because they are incompatible types. Also casting type int to double are incompatible types. Your first block of code:

    double a=1.5;
    int b=(int)a;
    System.out.println(b);
    

    will print "1". You will lose the decimals. If you want to just print the number before the decimal point then you can format your double when you print and you won't need to cast to type int.

    But the reason the other don't work is because you are trying to cast to an incompatible type. It is strange that you say the last two blocks of code

    Object a=1.5;
    double b=(double)a;
    int c=(int)b;
    System.out.println(c);
    
    
    Object a=1.5;
    int b=(int)(double)a;
    System.out.println(b);
    

    These should not work because of incompatible types.

    0 讨论(0)
  • 2020-12-11 09:15

    When you declare the object Object a = 1.5 you can tell by checking System.out.println(a.getClass()) that the object is in fact cast to a Double instance. This can again be cast to a double because of unboxing conventions. After that the double value can be cast to an int.

    There are however no unboxing conventions to cast from a Double instance to an int, so the runtime will issue an ClassCastException if you try and do that. It cannot directly go from Double to Integer.

    0 讨论(0)
提交回复
热议问题