Downcasting in Java: Breaking Down the Compile Error
Sifat berorientasikan objek Java membolehkan upcasting, di mana objek subkelas boleh diberikan kepada pembolehubah kelas supernya. Walau bagaimanapun, apabila cuba melakukan operasi songsang yang dikenali sebagai downcasting, ralat kompilasi biasanya timbul.
Ralat kompilasi ini berpunca daripada ketidakupayaan pengkompil untuk menjamin bahawa objek downcast sebenarnya akan mempunyai jenis yang ditentukan oleh cast. . Pertimbangkan contoh di bawah:
public class demo { public static void main(String a[]) { B b = (B) new A(); // compiles with the cast, // but runtime exception - java.lang.ClassCastException } } class A { public void draw() { System.out.println("1"); } public void draw1() { System.out.println("2"); } } class B extends A { public void draw() { System.out.println("3"); } public void draw2() { System.out.println("4"); } }
Dalam contoh ini, pengkompil membenarkan penugasan objek A kepada pembolehubah jenis B (downcasting). Walau bagaimanapun, pada masa jalan, apabila kod cuba menggunakan kaedah yang hanya tersedia dalam kelas B, java.lang.ClassCastException dilemparkan. Ralat masa jalan ini menunjukkan ketidakpadanan antara jenis objek sebenar dan jenis yang dinyatakan dalam cast.
Nampaknya berlawanan dengan intuitif bahawa Java membenarkan downcasting walaupun berpotensi gagal pada masa jalan. Walau bagaimanapun, terdapat keadaan di mana merendahkan boleh dibenarkan dan mungkin berjaya. Satu senario biasa ialah apabila pembolehubah diketahui memegang objek subkelas tertentu pada masa jalan. Contohnya:
Object o = getSomeObject(); if (o instanceof String) { String s = (String) o; // This cast is valid as o is known to be a String at this point in the code }
Dalam contoh ini, kaedah getSomeObject() mengembalikan Objek yang mungkin menjadi contoh kelas String. Kata kunci instanceof digunakan untuk menyemak sama ada rujukan itu serasi dengan kelas String. Jika semakan berjaya, ia dijamin bahawa rujukan o memegang objek String, menjadikan operasi downcast selamat dan berjaya semasa runtime.
Terdapat kes penggunaan praktikal lain untuk downcasting juga. Sebagai contoh, ia boleh digunakan untuk mengakses kaedah atau medan khusus subkelas yang tidak didedahkan dalam superclass. Walau bagaimanapun, adalah penting untuk memastikan bahawa downcast dilakukan hanya apabila diketahui bahawa objek adalah daripada jenis subkelas yang dijangkakan.
Atas ialah kandungan terperinci Mengapa Penurunan Java Menghasilkan Ralat Penyusunan, dan Bilakah Ia Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!