Kotlin Academy · Ders

Kullanım Yeri Değişkenliği

Tür izdüşümleri

3. ders / 413 adım

Kullanım Yeri Değişkenliği, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. 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.

Kullanım Noktası Değişkenliği

Bazen bir jenerik sınıf genel olarak değişmezdir, ancak belirli bir işlev türü yalnızca üretir veya yalnızca tüketir. Kullanım noktası değişkenliği (tür projeksiyonları), out ya da in ifadesini türün kullanıldığı yerde uygular.

Kullanım Noktası Değişkenliği Neden Kullanılır?

MutableList<T> gibi değişmez bir sınıf, hem T'yi okuduğu hem de yazdığı için bildirim sırasında kovaryant yapılamaz. Ancak belirli bir işlev yalnızca bu sınıftan okuma yapabilir; projeksiyonlar da bunu güvenli biçimde ifade etmenizi sağlar.

out Projeksiyonu

Bir parametre türünü Array<out T> olarak yazmak kovaryant bir görünüm oluşturur: T okuyabilir, ancak yazamazsınız. Bu sayede Array<String> değerini Array<out Any> beklenen yere geçirebilirsiniz.

fun printArray(items: Array<out Any>) {
    for (item in items) println(item)
}

fun main() {
    val names: Array<String> = arrayOf("Ann", "Bob")
    printArray(names)
}

Yalnızca Okuma

out projeksiyonuyla derleyici okumalara (çıktıya) izin verir, yazmaları (girdiyi) yasaklar; çünkü yazma işlemi özgün dizinin tür güvenliğini bozabilir.

in Projeksiyonu

Array<in T> yazmak kontravaryant bir görünüm oluşturur: içine T yazabilirsiniz, ancak okumalar Any? olarak döner. Bu sayede T dizilerini veya T'nin herhangi bir üst türünün dizilerini kabul edebilirsiniz.

fun fill(dest: Array<in Int>, value: Int) {
    for (i in dest.indices) dest[i] = value
}

fun main() {
    val numbers: Array<Number> = arrayOf(0, 0, 0)
    fill(numbers, 7)
    println(numbers.toList())
}

Yalnızca Yazma

in projeksiyonuyla T değerleri yazabilirsiniz (girdi); ancak gerçek öğe türü herhangi bir üst tür olabileceğinden, okumalar için öğe türü en üst tür olarak görülür.

Projeksiyonlar ve Bildirim Yeri Değişkenliği

Bildirim yeri değişkenliği (class Box<out T>), sınıfın kullanıldığı her yerde geçerlidir. Kullanım noktası projeksiyonları (Box<out T> parametre olarak) ise yalnızca o tek noktada geçerlidir. Sınıfın kendisini değişmez tutmanız gerektiğinde projeksiyonları kullanın.

Yıldız Projeksiyonu

Tür bağımsız değişkeniyle hiç ilgilenmiyorsanız yıldız projeksiyonunu * kullanın. List<*>, türü bilinmeyen bir liste anlamına gelir; öğeleri üst sınır türü olarak okuyabilir, ancak güvenli bir şekilde yazamazsınız.

fun printSize(collection: List<*>) {
    println("Size: ${collection.size}")
}

fun main() {
    printSize(listOf(1, 2, 3))
    printSize(listOf("a", "b"))
}

Yıldız Projeksiyonunun Sınırları

* ile yine türden bağımsız üyeleri (örneğin size) çağırabilir ve öğeleri Any? olarak okuyabilirsiniz; ancak gerçek tür bilinmediği için öğe ekleyemezsiniz.

fun main() {
    val unknown: List<*> = listOf("x", "y")
    val first: Any? = unknown.first()
    println(first)
}

Projeksiyon Seçme

Bir işlev yalnızca okuma yapıyorsa out T, yalnızca yazma yapıyorsa in T, kesin tür önemsizse * kullanın. Bu projeksiyonlar, değişmez sınıfları esnek ve tür açısından güvenli biçimlerde kullanılabilir hâle getirir.

Java Joker Türleriyle İlişkisi

Kotlin'in out T ve in T projeksiyonları, Java'nın ? extends T ve ? super T joker türlerine karşılık gelir. Java generic türlerini biliyorsanız projeksiyonlar size tanıdık gelecektir.

Kısa Kontrol

Array<out Any> türünde bir parametreyle ne yapabilirsiniz?

Özet

Kullanım yeri varyansı, belirli bir kullanımda out (salt okunur) veya in (salt yazılır) projeksiyonlarını, tür bilinmediğinde ise yıldız projeksiyonu olarak * işaretini uygular. Bu, bildirimini değiştirmeden değişmez sınıfları esnek hâle getirir. Sırada generic tür parametrelerini generic kısıtlarıyla sınırlayacaksınız.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Kullanım Yeri Değişkenliği” dersi ücretsiz mi?

Evet — “Kullanım 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.

“Kullanım Yeri Değişkenliği” dersinde ne öğreneceğim?

Tür izdüşümleri 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 3. dersidir.

“Kullanım 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

  1. Genel İşlevler ve Sınıflar
  2. Bildirim Yeri Değişkenliği
  3. Kullanım Yeri Değişkenliği
  4. Genel Tür Kısıtlamaları
← Kotlin Academy Sayfasına Dön