Upcasting diperbolehkan di Java, namun downcasting memberikan kesalahan kompilasi.
Kesalahan kompilasi dapat dihapus dengan menambahkan gips tetapi tetap akan rusak saat runtime.
Dalam hal ini mengapa Java memungkinkan downcasting jika tidak dapat dijalankan pada saat runtime?
Apakah ada kegunaan praktis untuk konsep ini?
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");
}
}
Jawaban:
Downcasting diperbolehkan ketika ada kemungkinan berhasil pada saat run time:
Dalam beberapa kasus ini tidak akan berhasil:
Ketika seorang pemain (seperti yang terakhir ini) gagal saat runtime a
ClassCastException
akan dilempar.Dalam kasus lain, ini akan berhasil:
Perhatikan bahwa beberapa pemain akan dianulir pada waktu kompilasi, karena mereka tidak akan pernah berhasil sama sekali:
sumber
Object o = new Object(); String s = (String) o;
Ini bekerja dengan baik untuk saya ..: O Bagaimana?Dengan menggunakan contoh Anda, Anda bisa melakukan:
sumber
Saya yakin ini berlaku untuk semua bahasa yang diketik secara statis:
Typecast secara efektif mengatakan: anggap ini adalah referensi ke kelas pemain dan gunakanlah seperti itu. Sekarang, katakanlah o benar - benar Integer, dengan anggapan ini adalah String tidak masuk akal dan akan memberikan hasil yang tidak terduga, sehingga perlu ada pemeriksaan runtime dan pengecualian untuk memberi tahu lingkungan runtime bahwa ada sesuatu yang salah.
Dalam penggunaan praktis, Anda dapat menulis kode yang bekerja pada kelas yang lebih umum, tetapi melemparkannya ke subkelas jika Anda tahu apa itu subkelas dan perlu memperlakukannya seperti itu. Contoh tipikal adalah menimpa Object.equals (). Asumsikan kita memiliki kelas untuk Mobil:
sumber
Kita semua dapat melihat bahwa kode yang Anda berikan tidak akan berfungsi pada saat dijalankan. Itu karena kita tahu bahwa ekspresi
new A()
dapat tidak pernah menjadi sebuah objek dari tipeB
.Tapi bukan itu yang dilihat kompiler. Pada saat kompiler memeriksa apakah para pemain diperbolehkan, ia hanya melihat ini:
Dan seperti yang telah ditunjukkan orang lain, para pemeran semacam itu sangat sah. Ekspresi di sebelah kanan bisa sangat baik mengevaluasi ke objek bertipe
B
. Kompilator melihat ituA
danB
memiliki hubungan subtipe, jadi dengan tampilan "ekspresi" kode, para pemain mungkin bekerja.Compiler tidak mempertimbangkan case khusus ketika ia tahu persis tipe objek apa yang
expression_of_type_A
benar-benar akan miliki. Itu hanya melihat tipe statis sebagaiA
dan menganggap tipe dinamis bisaA
atau keturunan apa punA
, termasukB
.sumber
Saya percaya ini karena tidak ada cara bagi kompiler untuk mengetahui pada waktu kompilasi apakah para pemeran akan berhasil atau tidak. Sebagai contoh Anda, mudah untuk melihat bahwa para pemain akan gagal, tetapi ada saat-saat di mana itu tidak begitu jelas.
Sebagai contoh, bayangkan bahwa tipe B, C, dan D semuanya memperpanjang tipe A, dan kemudian sebuah metode
public A getSomeA()
mengembalikan sebuah instance dari B, C atau D tergantung pada angka yang dihasilkan secara acak. Kompiler tidak dapat mengetahui tipe run-time yang tepat yang akan dikembalikan oleh metode ini, jadi jika Anda kemudian memberikan hasilnyaB
, tidak ada cara untuk mengetahui apakah para pemeran akan berhasil (atau gagal). Oleh karena itu kompiler harus mengasumsikan gips akan berhasil.sumber
@ Poster Asli - lihat komentar sebaris.
sumber
Downcast bekerja dalam kasus ketika kita berhadapan dengan objek upcasted. Siaran:
Jadi sekarang
objValue
variabel ini selalu dapat diturunkanint
karena objek yang dilemparkan adalahInteger
,tetapi karena
objValue
merupakan Obyek, ia tidak dapat dilemparkan keString
karenaint
tidak dapat dilemparkan keString
.sumber
Downcasting sangat berguna dalam cuplikan kode berikut yang saya gunakan ini sepanjang waktu. Dengan demikian membuktikan bahwa downcasting bermanfaat.
Saya menyimpan String di Daftar Tertaut. Ketika saya mengambil elemen Daftar Tertaut, Objek dikembalikan. Untuk mengakses elemen sebagai Strings (atau Obyek Kelas lainnya), downcasting membantu saya.
Java memungkinkan kita untuk mengkompilasi kode downcast mempercayai kita bahwa kita melakukan hal yang salah. Namun jika manusia membuat kesalahan, itu tertangkap saat runtime.
sumber
void*
pointer di C ++. Bagi saya itu sama sekali bukan ide yang bagus.Perhatikan contoh di bawah ini
di sini kita membuat objek dari subclass Bone dan menugaskannya ke referensi super kelas AOne dan sekarang referensi superclass tidak tahu tentang metode metode2 dalam subkelas yaitu Bone selama waktu kompilasi. referensi yang dihasilkan dapat mengetahui tentang adanya metode dalam subkelas yaitu Bone
sumber
Untuk melakukan downcasting di Java, dan menghindari pengecualian run-time, ambil referensi kode berikut:
Di sini, Hewan adalah kelas induk dan Anjing adalah kelas anak.
instanceof adalah kata kunci yang digunakan untuk memeriksa apakah variabel referensi berisi jenis referensi objek tertentu atau tidak.
sumber
Transformasi objek yang tidak dapat dilakukan dengan sendirinya tidak dimungkinkan. Hanya
mungkin
sumber