ProgramlamaAndroid geliştirici

Kotlin'da normal, inline ve reified generic parametreler arasındaki farkı açıklar mısınız? Reified ne zaman ve neden kullanılır, standart generic yaklaşımının hangi kısıtlamalarını kaldırır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Kotlin'de jenerikler (generic parametreler) varsayılan olarak silinir (type erasure): çalışma zamanında tür bilgisi yoktur. Bu, yansıtma (reflection), tür dönüşümü ve tür bazında anotasyon okumayı zorlaştırır. Çoğu görev için bu kabul edilebilir — normal jenerikler Java'ya benzer şekilde çalışır.

Inline fonksiyonlar ile reified parametresi, derleyiciyi bir çağrı yerinde belirli bir türün "yerine geçmesini" sağlamaya olanak tanır. Bu sayede fonksiyon çalışma zamanı aşamasında tür ile işlemler yapabilir (örneğin, kontroller yapabilir, yansıma (reflection) kullanarak yeni örnekler oluşturabilir vb.). Ancak reified, yalnızca inline fonksiyonlar için kullanılabilir.

Kıyaslama örneği:

// Normal generic fun <T> printType(t: T) { println(t.javaClass) // List<Int> için ClassCastException çağırır ve diğerleri. } // reified ile inline fun <reified T> printType(t: T) { println(T::class.simpleName) } fun main() { printType(123) // Çıktı: Int printType("hello") // Çıktı: String }

Uygulama pratiği: Çoğunlukla tür kontrolü, tür dönüşümü, yansıtma, örnek oluşturma için kullanılır; diğer yollarla tür alma mümkün olmadığında.

İğneli soru

"Reified bir türe sahip bir fonksiyon inline olmadan olabilir mi?"

  • Hayır — reified yalnızca inline fonksiyonlarda çalışır. Aksi takdirde, derleme aşamasında türün yerini alması mümkün değildir.

Geçersiz kullanım örneği:

fun <reified T> failFunction() {} // Derleme hatası: reified type parameter yalnızca inline fonksiyonlarda kullanılabilir

Doğru:

inline fun <reified T> goodFunction() {}

Konuyla ilgili bilmeyerek yapılan hatalardan gerçek örnekler


Hikaye

Projede JSON dizelerini herhangi bir tipe evrensel olarak ayrıştırmak gerekti. fun <T> parse(json: String): T üzerinden standart uygulama doğru şekilde çalışmadı çünkü type erasure nedeniyle, koleksiyonlar ve genel modeller için Class<T> elde edilemedi. reified tipiyle inline kullanımına geçildi — sorun yok oldu.


Hikaye

Geliştiricilerden biri, T() normal yapıcısını kullanarak T türünün örneklerini yaratmaya çalışıyordu, inline ve reified kullanmadan. Derleme aşamasında hata meydana geldi çünkü tür bilgisi silinmişti. inline fun <reified T: Any> yazarak bu sorunu standart dil araçlarıyla çözmeyi başardı.


Hikaye

Normal bir fonksiyonda (inline olmadan) reified kullanmaya çalışırken — IDE kafa karıştırıcı bir derleme hatası verdi. Geliştirici, nedeni uzun süre aradı, nihayetinde belgeleri inceleyip fonksiyonu inline ekleyerek düzeltti.