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 Appledan kemudian pengetahuan itu dibuang dengan menyimpan referensi dalam variabel tipe Fruit. Maka Anda ingin menggunakan referensi yang sama dengan Applelagi.
Karena informasi itu hanya dibuang "secara lokal", tentu saja, kompiler dapat mempertahankan pengetahuan yang parentbenar-benar sebuah Apple, meskipun jenis yang dinyatakannya adalah Fruit.
Tetapi biasanya tidak ada yang melakukan itu. Jika Anda ingin membuat Appledan menggunakannya sebagai Apple, Anda menyimpannya dalam Applevariabel, bukan variabel Fruit.
Ketika Anda memiliki Fruitdan ingin menggunakannya sebagai Applebiasanya berarti Anda memperoleh Fruitmelalui 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 parseFruitfungsi 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 Appledan mungkin ingin menggunakan Applemetode, 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.