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.
"Reified bir türe sahip bir fonksiyon inline olmadan olabilir mi?"
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() {}
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.reifiedtipiyle 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.