Penghantaran Eksplisit daripada Superclass kepada Subkelas: Perangkap Masa Jalanan Tersembunyi
Dalam Java, pemutus membenarkan penukaran objek daripada satu jenis kepada jenis yang lain . Walau bagaimanapun, apabila menghantar daripada superclass kepada subclass, seperti dalam coretan kod di bawah:
public class Animal { public void eat() {} } public class Dog extends Animal { public void eat() {} public void main(String[] args) { Animal animal = new Animal(); Dog dog = (Dog) animal; } }
pengkompil membenarkan tugasan tanpa ralat, walaupun pada hakikatnya masa jalan akan gagal dengan pengecualian ClassCastException. Mengapakah percanggahan ini wujud, dan bagaimanakah kita boleh mengelakkan perangkap ini?
Untuk memahami isu ini, adalah penting untuk diingat bahawa penghantaran ialah operasi masa jalan, bukan kompilasi. Pengkompil tidak mengesahkan kesahihan pelakon pada masa penyusunan. Sebaliknya, ia mengandaikan bahawa pengaturcara mempunyai sebab yang kukuh untuk melaksanakan pelakon dan mempercayai mereka untuk memastikan kesahihannya.
Walau bagaimanapun, pada masa jalanan, JVM menyemak sama ada objek yang dirujuk oleh pembolehubah superclass sememangnya suatu contoh subkelas. Jika tidak, ClassCastException dilemparkan. Dalam contoh kami, pembolehubah 'haiwan' merujuk kepada contoh kelas 'Haiwan', jadi menghantarnya ke 'Anjing' gagal kerana 'Anjing' bukan 'Haiwan'.
Pengkompil tidak dapat mengesan ralat ini kerana tidak mungkin untuk menjamin pada masa penyusunan bahawa objek yang dirujuk oleh pembolehubah superclass akan sentiasa menjadi contoh subkelas. Sebaliknya, ia bergantung pada pengaturcara untuk menggunakan pemutus dengan bijak dan mengendalikan sebarang kemungkinan pengecualian ClassCastException dengan sewajarnya.
Jadi, walaupun menghantar daripada superclass kepada subkelas boleh menjadi mudah, adalah penting untuk mengingati potensi perangkapnya. Sentiasa sahkan kesahihan pelakon sebelum menggunakannya, biasanya dengan semakan contoh. Pendekatan proaktif ini membantu menghalang pengecualian masa jalan dan memastikan keteguhan kod anda.
Atas ialah kandungan terperinci Mengapa Hantaran Eksplisit dari Superclass ke Subclass Membawa kepada Ralat Runtime di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!