Java'daki tür dönüştürme mekanizması (type casting), programcının bir türün değerini açıkça veya kapalı olarak başka bir türe dönüştürmesine olanak tanır. Tarihsel olarak bu özellik C ve C++'tan miras alınmıştır, ancak Java'da tür güvenliğini artırmak ve taşma veya veri kaybı ile ilgili gizli hataları önlemek için sınırlıdır.
Sorun, referans türlerin dönüştürülmesi sırasında ClassCastException oluşma olasılığında ve ayrıca temel türlerin dönüştürülmesi sırasında doğruluk kaybı (örneğin, double'dan int'e geçiş sırasında) bulunmaktadır. "Downcasting" (alt tür olarak dönüştürme) sırasında bir örneğin bu sınıfa ait olmaması durumunda mantıksal hatalar mümkün olabilir.
Çözüm, katı bir ayrımla yapılmaktadır:
Temel türler için kod örneği:
int i = 100; long l = i; // kapalı dönüştürme (int -> long) double d = l; // kapalı (long -> double) int i2 = (int) d; // açık dönüştürme (ondalık kısım kaybı)
Referans türler için kod örneği:
Object obj = "Hello"; // upcasting, kapalı String s = (String) obj; // downcasting, açık
Ana özellikler:
Java derleyicisi, hatalı tür dönüştürmelerini tamamen önleyebilir mi?
Cevap: Hayır, derleyici yalnızca derleme aşamasında belirgin hataları yakalar. Dönüştürme, tür yapısı içinde mümkün olduğunda (örneğin, Object -> String), ancak değişkende gerçekten uyumsuz bir türde nesne varsa, hata yalnızca çalıştırma sırasında ClassCastException ile ortaya çıkacaktır.
Integer Long'dan miras alıyor mu ve Integer i = (Integer) someLong yazabilir miyiz?
Cevap: Hayır, Integer ve Long bağımsız sarmalayıcı sınıflardır; aralarında downcasting yapılamaz. İkisi de Number'dan miras alır, ancak birbirlerinden değil. (Integer) (Object) 1L; şekli bir ClassCastException ile sonuçlanacaktır.
Açık dönüştürme ile float'ın int'e dönüştürülmesi sırasında kesir kısmı yuvarlanıyor mu?
Cevap: Hayır, yuvarlama yerine kesir kısmı kesilir:
float f = 3.99f; int i = (int) f; // i == 3, 4 değil
Geliştirici, bir Object koleksiyonunu alır, her bir öğeyi kendi türüne dönüştürür, ancak instanceof'ı kontrol etmez. Proje yanlış verilerle ClassCastException ile sürekli çöküş yaşar.
Artılar:
Eksiler:
Tüm downcasting işlemleri içinde if (obj instanceof TargetType) şemasında açık hata işleme ile yapılır. Koleksiyonlar için generikler kullanılır.
Artılar:
Eksiler: