Genellikle, derleyicinin bir şeyin türü hakkında sahip olduğu statik olarak bilinen bilgi, bildiğinizden (veya en azından umarım) daha az spesifik olduğunda, küçümseme yapmaktır.
Örneğiniz gibi durumlarda, nesne bir olarak yaratıldı Appleve daha sonra bu bilgi, referansı bir değişken türünde saklayarak atıldı Fruit. Sonra Appletekrar aynı referansı kullanmak istersiniz .
Bilgiler yalnızca "yerel olarak" atıldığından, derleyici , bildirilen türü olmasına rağmen parentgerçekten bir olan bilgiyi koruyabilirdi .AppleFruit
Ama genellikle kimse bunu yapmaz. Bir oluşturmak Appleve bir olarak kullanmak istiyorsanız Apple, bunu bir Appledeğişkende değil , bir değişkende Fruitsaklarsınız.
Eğer sahip olduğunuzda Fruitve bunu kullanmak istediğinizde , genellikle her türlü dönüşü sağlayabilecek bazı yollarla Appleelde ettiğiniz Fruitanlamına gelir , ancak bu durumda bunun bir olduğunu bilirsiniz . Hemen hemen her zaman onu inşa etmediniz, başka bir kodla geçtiniz.FruitApple
Bunun bariz bir örneği, parseFruit"elma", "portakal", "limon" vb. Gibi dizeleri uygun alt sınıfa çevirebilecek bir fonksiyonum varsa ; Genellikle bu işlevi çeşit döndürdüğünü yaklaşık biz (ve derleyici) bilebiliriz Fruitama ararsanız parseFruit("apple")o zaman ben en bir arayacaktım biliyoruz Appleve kullanmak isteyebilirsiniz Appleı downcast böylece, yöntemleri.
Yine yeterince akıllı bir derleyici , burada parseFruitsabit bir kodla çağırdığım için kaynak kodunu satır içine alarak anlayabiliyordu (başka bir modülde değilse ve Java gibi ayrı bir derlememiz yoksa). Ancak, dinamik bilgileri içeren daha karmaşık örneklerin derleyicinin doğrulaması için daha zor (hatta imkansız!) Olabileceğini kolayca görebilmelisiniz.
Gerçekçi kod downcast'leri genellikle derleyicinin downcast'in jenerik yöntemler kullanarak güvenli olduğunu doğrulayamadığı ve downcasting ile geri almaya çalıştığımız aynı tür bilgileri atarak bir upcast'i takip eden gibi basit durumlarda değil.