Kotlin'de as operatörü, açık tür dönüşümü (cast) için kullanılır. İki tür vardır: as ve as?. Biri istisna fırlatır, diğeri daha güvenlidir. Bu araç, polimorfizmle çalışmak ve veri göçü ile dış API'lerle etkileşimde önemli bir rol oynar.
Java'da tür dönüşümünde (TargetType)obj casting operatörü kullanılır ve hata durumunda ClassCastException fırlatır. Kotlin, bu kavramı geliştirerek güvenli casting (as?) eklemiş ve nullability ile çalışma zamanındaki hataları daha uygun ve açık bir şekilde yönetmeyi sağlamıştır.
Büyük bir projede katı tür dönüşümü tehlikelidir: Eğer tür uyuşmazsa, program aniden kapanır (ClassCastException). Böyle bir durumu minimuma indirmek gerekir, sessiz hatalar veya NPE olmadan. Hatanın ne zaman işlenmesi gerektiğini ve ne zaman sadece null döndürmenin yeterli olduğunu iyi ayırmak önemlidir.
Kotlin iki operatör sunar:
as: katı tür dönüşümü, türler uyuşmadığında ClassCastException fırlatır.as?: güvenli dönüşüm — eğer dönüşüm mümkün değilse null döndürür.val x: Any = "Hello, Kotlin!" val s1: String = x as String // Tamam, x bir String val s2: String? = x as? String // Tamam, x bir String val n: Int? = x as? Int // n = null, güvenli dönüşüm
as, hata durumunda ClassCastException fırlatır.as? null döndürür, acil hataları minimuma indirir.'as' her zaman türü runtime'da mı kontrol ediyor?
Evet, eğer dönüşüm uyumsuz türler arasında gerçekleşirse, ClassCastException oluşacaktır. Ancak bazı açık olmayan dönüşümlerde, örneğin Int ve Float arasında, böyle bir dönüşüm gerçekleşmez — Kotlin'de idiomatik dönüşüm yöntemler aracılığıyla (toInt, toFloat).
Nullable türü not-null türü ile kullanmak mümkün mü?
Evet, ama dikkatli olun: değer null çıkarsa, istisna fırlatılır. Nullable türden not-nullable türüne dönüşüm, kontrol yapılmadan gerçekleştirilirse runtime hatasına neden olabilir.
val x: String? = null val y: String = x as String // ClassCastException fırlatır!
'is' ile 'as' arasındaki fark nedir?
'is' tür kontrol operatörüdür. true/false döner, türü dönüştürmez. 'as' tam olarak türü dönüştürür ve mümkün değilse istisna fırlatır (veya 'as?' kullanıldığında null döndürür). Genellikle güvenli dönüşüm için birlikte kullanılırlar:
if (x is String) { val s: String = x // akıllı dönüşüm }
Veri ayrıştırma modülünde tüm nesneler as ile ayrıştırılır, örneğin obj as Double. Eğer veriler hatalıysa — uygulama ClassCastException ile çöker.
Artılar:
Eksiler:
Akıllı-cast (is ile) veya güvenli cast (as?) yapısı kullanılır:
val price = (obj as? Double) ?: 0.0
Artılar:
Eksiler: