Çü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.
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.
Learn about covariance and contravariance and how they affect assignment compatibility. See a code example that demonstrates the differences between them.
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.
Learn about covariance and contravariance and how they affect assignment compatibility. See a code example that demonstrates the differences between them.