0Pricing
Kotlin Academy · Ders

Yıldız Projeksiyonu ve * Ne Zaman Kullanılır

Bilinmeyen genel türler için yıldız projeksiyonunu uygulayın ve sınırlarını anlayın.

Yıldız Projeksiyonu ve * Ne Zaman Kullanılır, 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.

Yıldız Projeksiyonu Nedir

Yıldız projeksiyonu (*), Kotlin'de "tür bağımsız değişkeni bilinmeyen bir jenerik tür" demenin yoludur. Java'nın ham türünün veya sınırsız joker türünün <?> güvenli karşılığıdır.

fun printList(list: List<*>) {
    for (item in list) println(item)
}
fun main() {
    printList(listOf(1, 2, 3))
    printList(listOf("a", "b"))
    printList(listOf(true, 42, "mixed"))
}

Yıldız Projeksiyonlu Türlerden Okuma

Bir List<*> içinden öğeleri Any? olarak okuyabilirsiniz. Gerçek tür bilinmediği için öğe ekleyemezsiniz.

fun process(list: List<*>) {
    val first: Any? = list.firstOrNull()
    println("First: $first, Size: ${list.size}")
    // list.add("x") // compile error: can't write to List<*>
}
fun main() {
    process(listOf(10, 20, 30))
}

Yıldız ve out Any Karşılaştırması

List<*> ve List<out Any?> eşdeğerdir. Yıldız projeksiyonu, üst sınıra sahip kovaryant projeksiyonun kısa yazımıdır.

fun sumStars(list: List<*>): Int = list.size
fun sumOut(list: List<out Any?>): Int = list.size
fun main() {
    val l = listOf(1, "two", true)
    println(sumStars(l))  // 3
    println(sumOut(l))    // 3
}

İşlev Parametrelerinde Yıldız Projeksiyonu

Herhangi bir jenerik varyantı kabul etmeniz, ancak T'yi bilmeyi gerektirmeyen yöntemleri çağırmanız gerektiğinde işlev imzalarında * kullanın.

fun containerInfo(map: Map<*, *>): String {
    return "keys=${map.keys.size}, values=${map.values.size}"
}
fun main() {
    val m = mapOf(1 to "one", 2 to "two")
    println(containerInfo(m))
}

MutableList ile Yıldız Projeksiyonu

MutableList<*> için Any? olarak okuyabilirsiniz, ancak hiçbir şekilde yazamazsınız — derleyici bunu engeller.

fun clearFirstElement(list: MutableList<*>) {
    if (list.isNotEmpty()) {
        list.removeAt(0)  // OK: remove by index doesn't need T
        // list.add("x") // Error: can't write unknown type
    }
}
fun main() {
    val m = mutableListOf(1, 2, 3)
    clearFirstElement(m)
    println(m) // [2, 3]
}

Yıldız Projeksiyonlu Sınıf

Çalışma zamanında jenerik bir sınıfın türünü denetlerken tür bağımsız değişkenleri silindiği için yıldız projeksiyonunu kullanın.

fun isListOfSomething(obj: Any): Boolean {
    return obj is List<*>  // OK with star
    // obj is List<String> // Warning: cannot check erased type
}
fun main() {
    println(isListOfSomething(listOf(1, 2)))  // true
    println(isListOfSomething("not a list"))  // false
}

Birden Çok Yıldız Parametresi

Çiftler veya türleri bilinmeyen eşlemelerle çalışırken bir işlevde birden çok yıldız projeksiyonlu parametre bulunabilir.

fun describeMap(map: Map<*, *>) {
    map.forEach { (k, v) ->
        println("${k?.javaClass?.simpleName} -> ${v?.javaClass?.simpleName}")
    }
}
fun main() {
    describeMap(mapOf("key" to 42, 1 to true))
}

Yıldız Projeksiyonu Kullanılmamalı: NOT

Bir koleksiyona yazmanız gerektiğinde veya bunun yerine sınırlandırılmış bir tür parametresi kullanabildiğinizde yıldız projeksiyonundan kaçının — sınırlandırılmış tür parametresi size daha fazla bilgi sağlar.

// Bad: loses type information
fun addToStar(list: MutableList<*>, item: Any?) {
    // list.add(item) // compile error
}
// Better: use bounded type parameter
fun <T : Any> addTyped(list: MutableList<T>, item: T) {
    list.add(item)
}
fun main() {
    val l = mutableListOf("a")
    addTyped(l, "b")
    println(l)
}

Yıldız Projeksiyonuyla Tür Denetimleri ve Dönüştürmeler

Jenerik sınıflar üzerinde instanceof denetimleri gerçekleştirmek için yıldız projeksiyonunu kullanın, ardından gerçek işlemler için belirli bir türe dönüştürün.

fun handleResponse(response: Any) {
    if (response is List<*>) {
        val list = response as List<*>
        println("List with ${list.size} elements")
        val first = list.firstOrNull()
        if (first is String) println("First string: $first")
    }
}
fun main() {
    handleResponse(listOf("hello", "world"))
    handleResponse(42)
}

Uygulama: Jenerik Olay Yönlendiricisi

Herhangi bir Handler<*> kabul eden, ancak türü belirli olayları güvenle yönlendiren bir yönlendiricidir.

interface Handler<in T> { fun handle(event: T) }
class LogHandler : Handler<Any> {
    override fun handle(event: Any) = println("Event: $event")
}
fun dispatch(handler: Handler<*>, event: Any) {
    @Suppress("UNCHECKED_CAST")
    (handler as Handler<Any>).handle(event)
}
fun main() {
    dispatch(LogHandler(), "click")
    dispatch(LogHandler(), 42)
}

reified Bağlamlarında Yıldız Projeksiyonu

Yıldız projeksiyonu, çalışma zamanı türünün KClass<*> aracılığıyla incelendiği yansıma ve serileştirme kodlarında özellikle yaygındır.

fun printClassName(klass: kotlin.reflect.KClass<*>) {
    println(klass.simpleName)
}
fun main() {
    printClassName(String::class)     // String
    printClassName(List::class)       // List
    printClassName(Int::class)        // Int
}

Kısa Kontrol

Bir List<*> içinden okuma yaptığınızda hangi türü elde edersiniz?

Özet

Yıldız projeksiyonu (*), salt okunur erişim için herhangi bir jenerik varyantı kabul eder. Bunu tür denetimleri, jenerik yardımcılar ve yansıma için kullanın. Bir koleksiyona yazmanız gerektiğinde veya sınırlandırılmış bir tür parametresi daha iyi tür güvenliği sağladığında yıldız projeksiyonundan kaçının.

Sıkça Sorulan Sorular

“Yıldız Projeksiyonu ve * Ne Zaman Kullanılır” dersi ücretsiz mi?

Evet — “Yıldız Projeksiyonu ve * Ne Zaman Kullanılır” 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.

“Yıldız Projeksiyonu ve * Ne Zaman Kullanılır” dersinde ne öğreneceğim?

Bilinmeyen genel türler için yıldız projeksiyonunu uygulayın ve sınırlarını anlayın. 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.

“Yıldız Projeksiyonu ve * Ne Zaman Kullanılır” 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. where ile Genel İşlevler ve Tür Kısıtlamaları
  2. Bildirim Yerinde Varyans: in ve out
  3. Yıldız Projeksiyonu ve * Ne Zaman Kullanılır
  4. Tür Silinmesi ve reified Tür Parametreleri
← Kotlin Academy Sayfasına Dön