where ile Genel İşlevler ve Tür Kısıtlamaları
Tekli ve çoklu tür kısıtlamalarına sahip genel işlevler yazın.
where ile Genel İşlevler ve Tür Kısıtlamaları, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 1. 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.
Jenerik İşlevlerin Temelleri
Jenerik işlevler, işlev adından önce köşeli ayraçlar içinde tür parametreleri kullanır. Tür parametresi, parametre ve dönüş türlerinde kullanılabilir.
fun <T> identity(value: T): T = value
fun <T> listOf2(a: T, b: T): List<T> = listOf(a, b)
fun main() {
println(identity(42)) // 42
println(identity("hello")) // hello
println(listOf2(1, 2)) // [1, 2]
}: Kısıtlamasıyla Üst Sınırlar
: kullanarak bir tür parametresine üst sınır getirin. Tür, sınır türünün bir alt türü olmalıdır.
fun <T : Comparable<T>> max(a: T, b: T): T = if (a >= b) a else b
fun main() {
println(max(3, 7)) // 7
println(max("apple", "banana")) // banana
// max(listOf(1), listOf(2)) // error: List is not Comparable
}Null Olabilir Üst Sınır
Varsayılan üst sınır Any? değeridir (null olabilir). Null değerini dışlamak için T : Any kullanın.
fun <T : Any> notNull(value: T?): T {
return value ?: throw IllegalArgumentException("Value is null")
}
fun main() {
println(notNull("hello")) // hello
try { notNull(null) } catch (e: Exception) { println(e.message) }
}where ile Birden Çok Kısıtlama
Tek bir tür parametresine birden çok kısıtlama uygulamak için where yan tümcesini kullanın.
fun <T> process(item: T): String
where T : Comparable<T>, T : CharSequence {
return "Length=${item.length}, sorted=${item > "a"}"
}
fun main() {
println(process("kotlin")) // Length=6, sorted=true
// process(42) // error: Int doesn't implement CharSequence
}Bir Sınıfta where
where yan tümcesi sınıf düzeyindeki tür parametreleriyle de çalışır.
class SortedContainer<T>(private val items: MutableList<T> = mutableListOf())
where T : Comparable<T>, T : Any {
fun add(item: T) { items.add(item); items.sort() }
fun top(): T? = items.lastOrNull()
}
fun main() {
val c = SortedContainer<Int>()
c.add(5); c.add(2); c.add(8)
println(c.top()) // 8
}Jenerik Genişletme İşlevleri
Genişletme işlevleri de tür parametrelerine sahip olabilir; böylece belirli jenerik türlerde kullanılabilirler.
fun <T : Comparable<T>> List<T>.second(): T? {
return if (size >= 2) this[1] else null
}
fun main() {
println(listOf(10, 20, 30).second()) // 20
println(listOf("a").second()) // null
}Dönüş Konumunda Tür Parametresi
Jenerik işlevler türü bağlamdan çıkarabilir; böylece çağrı noktasında açık tür bağımsız değişkenleri belirtmek gerekmez.
fun <T> MutableList<T>.popOrDefault(default: T): T {
return if (isEmpty()) default else removeAt(lastIndex)
}
fun main() {
val list = mutableListOf(1, 2, 3)
println(list.popOrDefault(0)) // 3
println(list.popOrDefault(0)) // 2
println(mutableListOf<Int>().popOrDefault(-1)) // -1
}Yeniden Kullanılabilir Jenerik Yardımcılar
Jenerik işlevler, yardımcı işlevlerin kod tekrarı olmadan farklı türlerde yeniden kullanılabilmesini sağlar.
fun <T> Iterable<T>.firstOrElse(default: T): T = firstOrNull() ?: default
fun <T, R : Comparable<R>> Iterable<T>.maxByOrElse(selector: (T) -> R, default: T): T =
maxByOrNull(selector) ?: default
fun main() {
println(listOf<String>().firstOrElse("fallback")) // fallback
println(listOf("a","bbb","cc").maxByOrElse({ it.length }, "")) // bbb
}Yıldız Projeksiyonu ve Sınırlandırılmış Joker Tür Karşılaştırması
Sınırlandırılmış bir tür parametresi kullanımıyla (T üretmeniz veya tüketmeniz gerektiğinde yararlıdır) yıldız projeksiyonunu (tür bilinmediğinde kullanılır) karşılaştırın.
fun <T : Number> sumList(list: List<T>): Double =
list.sumOf { it.toDouble() }
// Star projection: read-only, type unknown
fun printAll(list: List<*>) = list.forEach { println(it) }
fun main() {
println(sumList(listOf(1, 2, 3))) // 6.0
printAll(listOf("a", 1, true)) // a, 1, true
}Jenerik Çift Değişimi
Pair bileşenlerinin sırasını tersine çeviren basit ama öğretici bir jenerik işlevdir.
fun <A, B> Pair<A, B>.swap(): Pair<B, A> = Pair(second, first)
fun main() {
val pair = Pair("hello", 42)
val swapped = pair.swap()
println(swapped) // (42, hello)
}Uygulama: Jenerik Sonuç Açıcı
Türü belirli bir dönüşümle Result<T> üzerinde eşleme yapan bir yardımcı yazmak için sınırlandırılmış jenerikleri kullanın.
fun <T : Any, R : Any> Result<T>.mapNotNull(transform: (T) -> R?): Result<R> {
return fold(
onSuccess = { v ->
val r = transform(v)
if (r != null) Result.success(r) else Result.failure(NoSuchElementException())
},
onFailure = { Result.failure(it) }
)
}
fun main() {
val r = Result.success("123")
val n = r.mapNotNull { it.toIntOrNull() }
println(n) // Success(123)
}Kısa Kontrol
Tek bir tür parametresine birden çok kısıtlamayı nasıl uygularsınız?
Özet
Jenerik işlevler, yeniden kullanılabilir ve tür açısından güvenli kod yazmak için tür parametrelerini kullanır. Tek bir sınır için :, birden çok sınır için where ile kısıtlama getirin. Kotlin derleyicisi, çağrı noktasındaki kısıtlamaları zorunlu kılar.
Sıkça Sorulan Sorular
“where ile Genel İşlevler ve Tür Kısıtlamaları” dersi ücretsiz mi?
Evet — “where ile Genel İşlevler ve Tür Kısıtlamaları” 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.
“where ile Genel İşlevler ve Tür Kısıtlamaları” dersinde ne öğreneceğim?
Tekli ve çoklu tür kısıtlamalarına sahip genel işlevler yazı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 1. dersidir.
“where ile Genel İşlevler ve Tür Kısıtlamaları” 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
- where ile Genel İşlevler ve Tür Kısıtlamaları
- Bildirim Yerinde Varyans: in ve out
- Yıldız Projeksiyonu ve * Ne Zaman Kullanılır
- Tür Silinmesi ve reified Tür Parametreleri