เหตุใดจึงไม่สามารถส่งค่าวัตถุ 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;

เหตุผล : แผนที่การแปลงมวย ดั้งเดิม และ wrappers โดยตรง สิ่งที่ฉันกำลังพูดคือ มีเพียงไบต์เดียวเท่านั้นที่สามารถแปลงเป็นไบต์ได้โดยไม่ต้องระบุประเภทอย่างชัดเจน หากคุณต้องการแปลง byte เป็น Double คุณต้องใช้สิ่งนี้อย่างชัดเจน:

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

เพราะมีเพียง double เท่านั้นที่สามารถแปลงเป็น Double ได้

person TheLostMind    schedule 21.04.2015

คำตอบคือวิธีที่ประเภทดั้งเดิม บรรจุกล่องอัตโนมัติ ลงใน wrapper ประเภทในภาษาจาวา คุณยังสามารถทำอะไรบางอย่างเช่น

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

คุณสามารถดูเอกสารประกอบของการออโต้บ็อกซ์และการแกะกล่องได้

การทำกล่องอัตโนมัติและการแกะกล่องช่วยให้นักพัฒนาเขียนโค้ดที่สะอาดขึ้น ทำให้อ่านง่ายขึ้น ตารางต่อไปนี้แสดงรายการประเภทดั้งเดิมและคลาส wrapper ที่สอดคล้องกัน ซึ่งคอมไพเลอร์ Java ใช้สำหรับการทำ autoboxing และ unboxing:

ป้อนคำอธิบายรูปภาพที่นี่

จากตารางนี้ คุณจะไม่สามารถออโต้บ็อกซ์ได้โดยตรงและไม่สามารถส่งเป็นสองเท่าจากไบต์ได้ และคุณไม่สามารถแกะกล่องเพื่อเพิ่มเป็นสองเท่าจาก Byte ได้


แต่คุณสามารถส่งประเภทดั้งเดิมไปเป็นประเภทดั้งเดิมแล้วทำการออโต้บ็อกซ์ไปยังอ็อบเจ็กต์คลาส 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