Biasanya downcasting adalah apa yang Anda lakukan ketika pengetahuan yang diketahui secara statis tentang kompiler tentang jenis sesuatu kurang spesifik dari apa yang Anda ketahui (atau setidaknya harapan).
Dalam situasi seperti contoh Anda, objek dibuat sebagai Apple
dan kemudian pengetahuan itu dibuang dengan menyimpan referensi dalam variabel tipe Fruit
. Maka Anda ingin menggunakan referensi yang sama dengan Apple
lagi.
Karena informasi itu hanya dibuang "secara lokal", tentu saja, kompiler dapat mempertahankan pengetahuan yang parent
benar-benar sebuah Apple
, meskipun jenis yang dinyatakannya adalah Fruit
.
Tetapi biasanya tidak ada yang melakukan itu. Jika Anda ingin membuat Apple
dan menggunakannya sebagai Apple
, Anda menyimpannya dalam Apple
variabel, bukan variabel Fruit
.
Ketika Anda memiliki Fruit
dan ingin menggunakannya sebagai Apple
biasanya berarti Anda memperoleh Fruit
melalui beberapa cara yang umumnya dapat mengembalikan segala jenis Fruit
, tetapi dalam hal ini Anda tahu itu adalah Apple
. Hampir selalu Anda tidak hanya membangunnya, Anda telah melewatinya dengan beberapa kode lain.
Contoh yang jelas adalah jika saya memiliki parseFruit
fungsi yang dapat mengubah string seperti "apel", "oranye", "lemon", dll, menjadi subkelas yang sesuai; umumnya yang kita (dan kompiler) dapat tahu tentang fungsi ini adalah bahwa ia mengembalikan beberapa jenis Fruit
, tetapi jika saya menelepon parseFruit("apple")
maka saya tahu itu akan memanggil Apple
dan mungkin ingin menggunakan Apple
metode, jadi saya bisa downcast.
Sekali lagi kompiler yang cukup pintar dapat mengetahui hal itu di sini dengan menguraikan kode sumber untuk parseFruit
, karena saya memanggilnya dengan konstanta (kecuali ada di modul lain dan kami memiliki kompilasi terpisah, seperti di Jawa). Tetapi Anda harus dapat dengan mudah melihat bagaimana contoh yang lebih rumit yang melibatkan informasi dinamis dapat menjadi lebih sulit (atau bahkan tidak mungkin!) Bagi kompiler untuk memverifikasi.
Dalam kode downcasts realistis biasanya terjadi di mana kompiler tidak dapat memverifikasi bahwa downcast aman menggunakan metode generik, dan tidak dalam kasus sederhana seperti segera setelah upcast membuang informasi jenis yang sama yang kita coba untuk kembali dengan downcasting.