Çö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
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…