Bildirim Yeri Değişkenliği
in ve out
Bildirim Yeri Değişkenliği, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Değişkenlik Sorunu
List<String>, List<Any> türünde midir? Bazen evet, bazen hayır. Değişkenlik, tür parametreleri arasındaki ilişkiye göre jenerik türlerin nasıl ilişkilendiğini açıklar. Kotlin bunu ifade etmek için out ve in kullanır.
Varsayılan Olarak Değişmezlik
Varsayılan olarak jenerikler değişmezdir: String, Any türünün alt türü olsa bile Box<String>, Box<Any> değildir. Bu, güvenli olmayan işlemleri önler.
class Box<T>(val value: T)
fun main() {
val strBox = Box("hi")
// val anyBox: Box<Any> = strBox // would not compile
println(strBox.value)
}out ile Kovaryans
Bir tür parametresini out olarak işaretlemek onu kovaryant yapar: Producer<String>, Producer<Any> türünün alt türü olur. Tür yalnızca çıktı konumlarında (dönüş türlerinde) görünebilir.
class Producer<out T>(private val item: T) {
fun produce(): T = item
}
fun main() {
val strProducer: Producer<String> = Producer("hello")
val anyProducer: Producer<Any> = strProducer
println(anyProducer.produce())
}out Neden Güvenlidir?
Bir sınıf yalnızca T üretir (döndürür) ve onu hiçbir zaman tüketmezse, Producer<String> değerini Producer<Any> olarak değerlendirmek güvenlidir; çünkü döndürdüğü her String aynı zamanda Any'dir.
Standart Kütüphanede out
Kotlin'in salt okunur List<out E> türü kovaryanttır; bu nedenle List<String>, List<Any> beklenen yerde kullanılabilir.
fun printAll(items: List<Any>) {
items.forEach { println(it) }
}
fun main() {
val names: List<String> = listOf("Ann", "Bob")
printAll(names)
}in ile Kontravaryans
Bir tür parametresini in olarak işaretlemek onu kontravaryant yapar: Consumer<Any>, Consumer<String> türünün alt türü olur. Tür yalnızca girdi konumlarında (parametrelerde) görünebilir.
class Consumer<in T> {
fun consume(item: T) {
println("Consumed $item")
}
}
fun main() {
val anyConsumer: Consumer<Any> = Consumer()
val strConsumer: Consumer<String> = anyConsumer
strConsumer.consume("hi")
}in Neden Güvenlidir?
Any kabul eden bir tüketici elbette bir String de kabul edebilir. Bu nedenle Consumer<Any>, Consumer<String> gereken her yerde kullanılabilir.
PECS Hatırlatıcısı
Producer Genişletir, Consumer Üst Türdür ifadesini hatırlayın. Kotlin terimleriyle üreticiler için (çıktı) out, tüketiciler için (girdi) in kullanılır. Yalnızca T üreten bir tür out, yalnızca T alan bir tür ise in kullanır.
in ve out Birlikte
Hem girdi hem de çıktı için kullanılan bir tür parametresi (değiştirilebilir bir listede olduğu gibi) değişmez kalmalıdır. Function türleri her ikisini de gösterir: parametreler in, dönüş değeri ise out konumundadır.
fun main() {
val f: (Number) -> Int = { it.toInt() }
val g: (Int) -> Number = f
println(g(3.0.let { Number::class; 5 }))
}Bildirim Yeri Tek Bir Noktadır
Bildirim yeri değişkenliği, sınıfın kendisinde in/out ile bir kez bildirilir. Daha sonra sınıfın her kullanımı bu değişkenliği otomatik olarak alır; Java'da ise her kullanımda joker türleri tekrarlamanız gerekir.
in mi out mu Seçme
Şunu sorun: Bu sınıf yalnızca T mi üretiyor (out kullanın), yalnızca T mi tüketiyor (in kullanın), yoksa ikisini birden mi yapıyor (değişmez bırakın)? Değiştiriciyi rolle eşleştirmek, jenerik türlerinizi esnek ve güvenli kılar.
Kısa Kontrol
out değiştiricisi neyi belirtir?
Özet
Jenerikler varsayılan olarak değişmezdir. Bir tür yalnızca değer ürettiğinde kovaryans için out, yalnızca değer tükettiğinde kontravaryans için in kullanın. Üreticilerin out, tüketicilerin in kullandığını hatırlayın. Sırada, tür projeksiyonlarıyla değişkenliği kullanım noktasında uygulayacaksınız.
Sıkça Sorulan Sorular
“Bildirim Yeri Değişkenliği” dersi ücretsiz mi?
Evet — “Bildirim Yeri Değişkenliği” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“Bildirim Yeri Değişkenliği” dersinde ne öğreneceğim?
in ve out Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Bildirim Yeri Değişkenliği” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Genel İşlevler ve Sınıflar
- Bildirim Yeri Değişkenliği
- Kullanım Yeri Değişkenliği
- Genel Tür Kısıtlamaları