java中数字的自动取消装箱是否应该使用Number.xxxValue()而不是强制转换为XXX.xxxValue()?

java中数字的自动取消装箱是否应该使用Number.xxxValue()而不是强制转换为XXX.xxxValue()?,java,Java,示例效果最好,假设对象是一个字节,我们尝试将其转换为一个长 目前字节码看起来有点像这样 Byte b = Byte.valueOf(1); Object source = b; Long long = (Long) source; // fails CCE because a Byte is not a Long long value = long.longValue(); 一个数字演员不是更好吗 Byte b = Byte.valueOf(1); N

示例效果最好,假设对象是一个字节,我们尝试将其转换为一个长

目前字节码看起来有点像这样

   Byte b = Byte.valueOf(1);
   Object source = b;
   Long long = (Long) source;     // fails CCE because a Byte is not a Long
   long value = long.longValue();
一个数字演员不是更好吗

  Byte b = Byte.valueOf(1);
   Number number = (Number) b;     // f
   long value = number.longValue();

真正的问题当然是我们已经减少了ClassCastException的可能性,这是一件坏事吗?

为什么要强制转换<代码>字节s也有该方法

Byte b = Byte.valueOf(1);
long value = b.longValue();
或者更好:

byte b = 1;
long value = (long) b;

如果您不关心原始类型是什么,我会像您一样将其转换为一个数字。

从较小的整数转换为较大的整数,您不需要转换。这被称为晋升和委派工作:

    byte b = (byte) 200;
    long l = b;
    Long ll = l;

对于字节-字节和长-长转换,您可以使用自动装箱。

您所说的每一项都是真的,但在取消装箱时,编译器会插入一个强制转换。对不起,如果我没说清楚的话。第一个字节->长不是演员阵容,正如你所说的是晋升。我说的是我q中的角色转换。你从一个父类转换到另一个子类。由于byte和long之间没有子-父关系,因此无法将一个强制转换为另一个。只有在不需要强制转换时才会取消绑定。你能澄清你的问题吗?