Çözüldü Kotlin <out e> nedir?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

706111

Hectopat
Katılım
28 Ağustos 2023
Mesajlar
6.020
Makaleler
1
Çözümler
29
Arkadaşlar merhaba.

Collection konusunu çalışıyorum.

Aşağıdaki kod;
public interface List<out E>: Collection<E>

Şeklinde List'e arayüzünü, Collection arayüzüne genişletiyor. <out e> kafamı karıştırdı bayağı.

Çünkü out anahtarı e tipi ve e tipinden genişletilmiş nesneleri listeye aktarmaya izin veriyor lakin listeyi değiştirmiyormuş.
Yani iki özelliği birden mi sağlıyor? Yoksa sadece e tipi ve e tipinden genişletilmiş nesneleri mi aktarmaya izin veriyor.

@bitwise @TheAny @count
 
Çözüm
Bunu anlamak icin Kotlin disina cikmak gerekiyor.

Type-safe dillerde bir variable parameterized edilmis bir generic tipe assign edileceginde invariance kontrolu yapilir. Cunku runtime'da hata almak istemezsin.

Yani su kod Kotlin'de compile hatasi verecektir: ( Technopat'a Kotlin ve Go destegi gelsin artik )
Kod:
class Test<T>(val value: T) {
    fun x(): T = value
}
fun main() {
    val sTest: Test<String> = Test("test")
    val aTest : Test<Any> = sTest // invariant analizi basarisiz
}

Her ne kadar "Any", "String" super-type i olsa da invariant'i degil. Bu sebeple covariance ve contravariance kullanimi ile bu limitasyonun onune gecmek icin "out" ve "in" burada devreye giriyor.

Bu ozellik OO paradigmasi icinde var, Kotlin'den once C# da da kullanildi. Type-safe pek cok dilde aksi belirtilmedikce generic tipler invariant isterler.

Genel konsept -> Covariance and contravariance (computer science) - Wikipedia

Ustteki compile hatasi veren kodda "Test<out T>" seklinde covariance'a producer olarak OK oldugunu belirtmen yeterli compiler icin.

Bu arada bu yaklasim Liskov Substitution Prensibini de destekler. SOLID icerisindeki kimsenin anlamini tam bilmedigi "L" kismi :)

Covariant ya da Contravariant override yaklasimiyla daha esnek bir tasarim elde etmis oluruz type-safety den feragat etmeden.
Bunu anlamak icin Kotlin disina cikmak gerekiyor.

Type-safe dillerde bir variable parameterized edilmis bir generic tipe assign edileceginde invariance kontrolu yapilir. Cunku runtime'da hata almak istemezsin.

Yani su kod Kotlin'de compile hatasi verecektir: ( Technopat'a Kotlin ve Go destegi gelsin artik )
Kod:
class Test<T>(val value: T) {
    fun x(): T = value
}
fun main() {
    val sTest: Test<String> = Test("test")
    val aTest : Test<Any> = sTest // invariant analizi basarisiz
}

Her ne kadar "Any", "String" super-type i olsa da invariant'i degil. Bu sebeple covariance ve contravariance kullanimi ile bu limitasyonun onune gecmek icin "out" ve "in" burada devreye giriyor.

Bu ozellik OO paradigmasi icinde var, Kotlin'den once C# da da kullanildi. Type-safe pek cok dilde aksi belirtilmedikce generic tipler invariant isterler.

Genel konsept -> Covariance and contravariance (computer science) - Wikipedia

Ustteki compile hatasi veren kodda "Test<out T>" seklinde covariance'a producer olarak OK oldugunu belirtmen yeterli compiler icin.

Bu arada bu yaklasim Liskov Substitution Prensibini de destekler. SOLID icerisindeki kimsenin anlamini tam bilmedigi "L" kismi :)

Covariant ya da Contravariant override yaklasimiyla daha esnek bir tasarim elde etmis oluruz type-safety den feragat etmeden.
 
Son düzenleme:
Çözüm

Technopat Haberler

Yeni konular

Geri
Yukarı