为什么不能将Byte对象/字节值强制转换为Double对象?从Byte到Double的转换会影响精度吗?

时间:2015-04-21 05:29:46

标签: java casting double byte primitive

public class Primitive {
    public static void main(String []args) {


    byte x=5;
    Double y=(Double)x;  //Error :  Cannot cast from byte to Double.

    Byte n=7;
    Double m=(Double)n; //Error : cannot cast from Byte to Double.

    double c=n; //working right ..."double is primitive and Byte is object ".
    }
}

防止将字节转换为Double是什么意思? ..如果我没有错,我知道Double to Byte的精确原因。

5 个答案:

答案 0 :(得分:3)

因为这就是自动装箱取消拳击的工作原理。

此代码可以正常工作:

    byte x = 5;
    Integer i = (int) x;

原因:直接装箱转换地图原语及其包装 。我所说的是只有一个字节可以转换为字节而无需显式的类型转换。如果您需要将byte转换为Double,则需要明确使用以下内容:

    byte x = 5;
    Double d = (Double) (double) x; 

因为只有double可以转换为Double

答案 1 :(得分:1)

答案是Java中包装类型的原始类型auto-boxed的方式。您也可以执行类似

的操作
Double y = Byte.valueOf(x).doubleValue();
Double z = (double) x;

答案 2 :(得分:0)

您试图将原始byte投射到Double类,这是您无法做到的。如果您尝试使用以下代码,则不会出现问题:

byte x=5;
double y = (double)x;  // No error

如果您想使用Double类而不是原始double,那么您可以试试这个:

byte x=5;
Double y = Double.valueOf(x).doubleValue();

答案 3 :(得分:0)

Double with capital letters是一个类,而不是一个原始类。

你想做的是

 byte x=5;
 double y=(double)x;  

 byte n=7;
 double m=(double)n; 

 double c=n; 

将double转换为一个导致精度损失的字节(您将丢失所有小数)。一个字节就像一个int但是长8位。

答案 4 :(得分:0)

您可以查看此documentation自动装箱和拆箱。

  

自动装箱和取消装箱可让开发人员编写更清晰的代码,使其更易于阅读。下表列出了原始类型及其相应的包装类,Java编译器使用这些类进行自动装箱和拆箱:

enter image description here

所以基于这个表你不能直接自动装箱,也不能从字节转换为Double。而且你也不能从字节中取消加倍。


但是您可以将基元转换为基本类型,然后将其自动停放到其Wrapper类对象。您可以将Wrapper类对象解包为其基本类型,然后将其转换为其他基本类型。

byte x = 5;
double temp = x;
Double y = temp;

// Can be written as
byte x1 = 5;
Double y1 = (double) x1;

// ================
Byte n = 7;
byte byteVal = n;
double doubleVal = byteVal;
Double m = doubleVal;

// Can be written as
Byte n1 = 7;
Double m1 = (double) (byte) n1;

// =================
// But I still wonder how below code is working
double c = n;