Memahami Casting Eksplisit dan ClassCastException dalam Java
Dalam Java, kita boleh menggunakan hantaran eksplisit untuk menetapkan objek superclass kepada pembolehubah subkelas. Sebagai contoh, pertimbangkan kod berikut:
public class Animal { public void eat() {} } public class Dog extends Animal { public void eat() {} public static void main(String[] args) { Animal animal = new Animal(); Dog dog = (Dog) animal; } }
Walaupun kod berjaya disusun, melaksanakan baris Anjing anjing = (Anjing) haiwan; melontar ClassCastException pada masa jalan.
Mengapa ralat ini berlaku?
Pengkompil membenarkan penghantaran eksplisit, tetapi ia tidak dapat memastikan kesahihan hantaran pada masa penyusunan. Apabila anda menghantar objek daripada superclass ke subclass, anda pada asasnya mengarahkan pengkompil untuk mempercayai bahawa objek itu sebenarnya adalah instance subclass.
Dalam contoh kami, haiwan boleh ubah ialah contoh Haiwan kelas. Walau bagaimanapun, menghantarnya ke objek Anjing secara tersirat mengandaikan bahawa haiwan merujuk kepada objek Anjing, yang tidak berlaku. Oleh itu, JVM mengesahkan andaian ini pada masa jalan dan membuang ClassCastException apabila ia gagal.
Bagaimanakah kita boleh menghalang ralat sedemikian?
Untuk melakukan penghantaran eksplisit dengan selamat, kita harus lakukan semakan berikut:
Ringkasnya, jelas pemutus membolehkan kami mengatasi semakan jenis pengkompil, tetapi adalah penting untuk mendekatinya dengan berhati-hati dan mengesahkan kesahihan pelakon sebelum bergantung padanya.
Atas ialah kandungan terperinci Mengapa Java Melemparkan ClassCastException Semasa Casting Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!