Почему нельзя преобразовать объект Byte/значение байта в объект Double? влияет ли преобразование из Byte в Double на точность?

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 ".
    }
}

Какой смысл предотвращать приведение Byte к Double? .. я знаю Double to Byte по соображениям точности, если я не ошибаюсь.


person Spmmr    schedule 21.04.2015    source источник
comment
Вы не можете изменить тип и обернуть его как объект за один раз. Это два приведения в Java. Когда вы используете ссылку, это не может означать, что объект действительно изменится, может измениться только тип ссылки.   -  person Peter Lawrey    schedule 21.04.2015


Ответы (5)


Потому что именно так работает автоматическая упаковка и распаковка.

Этот код работает нормально:

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

Причина: бокс преобразования карты примитивов и их оболочек напрямую. Я хочу сказать, что только байт можно преобразовать в байт без явного приведения типов. Если вам нужно преобразовать byte в Double, вам нужно явно использовать что-то вроде этого:

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

потому что только double можно преобразовать в Double.

person TheLostMind    schedule 21.04.2015

Ответ заключается в том, что примитивные типы автоматически упаковываются в оболочку. типы в Java. Вы также можете сделать что-то вроде

Double y = Byte.valueOf(x).doubleValue();
Double z = (double) x;
person Elliott Frisch    schedule 21.04.2015

Вы пытались привести примитив byte к классу Double, чего не можете сделать. Если вместо этого вы попробуете следующий код, у вас не будет проблем:

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

Если вы хотите использовать класс Double вместо примитивного double, вы можете попробовать следующее:

byte x=5;
Double y = Double.valueOf(x).doubleValue();
person Tim Biegeleisen    schedule 21.04.2015

Двойник с заглавной буквы это класс, а не примитив.

Что вы хотите сделать, это

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

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

 double c=n; 

Приведение двойного числа к байту приводит к потере точности (вы потеряете все десятичные знаки). Байт похож на int, но имеет длину 8 бит.

person yafrack    schedule 21.04.2015

Вы можете ознакомиться с этой документацией по автоматической упаковке и распаковке.

Автоупаковка и распаковка позволяют разработчикам писать более чистый код, облегчая его чтение. В следующей таблице перечислены примитивные типы и соответствующие им классы-оболочки, которые используются компилятором Java для автоупаковки и распаковки:

введите здесь описание изображения

Таким образом, на основе этой таблицы вы не можете напрямую автобоксировать, а также не можете преобразовать в 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;
person Naman Gala    schedule 21.04.2015