Fungsi Generik dan Batasan Tipe dengan where
Tulislah fungsi generik dengan satu atau beberapa batasan tipe.
Fungsi Generik dan Batasan Tipe dengan where adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Dasar-Dasar Fungsi Generik
Fungsi generik menggunakan parameter tipe dalam kurung sudut sebelum nama fungsi. Parameter tipe tersebut dapat digunakan dalam tipe parameter dan tipe hasil.
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]
}Batas Atas dengan Batasan :
Batasi parameter tipe dengan batas atas menggunakan :. Tipe tersebut harus merupakan subtipe dari batasannya.
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
}Batas Atas yang Dapat Bernilai Null
Batas atas default adalah Any? (dapat bernilai null). Gunakan T : Any untuk mengecualikan null.
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) }
}Beberapa Batasan dengan where
Gunakan klausa where untuk menerapkan beberapa batasan pada satu parameter tipe.
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
}where pada Kelas
Klausa where juga berfungsi pada parameter tipe tingkat kelas.
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
}Fungsi Ekstensi Generik
Fungsi ekstensi juga dapat memiliki parameter tipe sehingga tersedia pada tipe generik tertentu.
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
}Parameter Tipe pada Posisi Hasil
Fungsi generik dapat menyimpulkan tipe dari konteks sehingga Anda tidak perlu menuliskan argumen tipe secara eksplisit di lokasi pemanggilan.
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
}Utilitas Generik yang Dapat Digunakan Kembali
Fungsi generik membuat fungsi utilitas dapat digunakan kembali pada berbagai tipe tanpa duplikasi.
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
}Proyeksi Bintang vs Karakter Pengganti Berbatas
Bandingkan penggunaan parameter tipe berbatas (berguna saat Anda perlu menghasilkan atau mengonsumsi T) dengan proyeksi bintang (saat tipenya tidak diketahui).
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
}Pertukaran Pasangan Generik
Fungsi generik sederhana tetapi ilustratif yang membalik komponen suatu pasangan.
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)
}Praktik: Pembuka Bungkus Result Generik
Gunakan generik berbatas untuk menulis utilitas yang menerapkan pemetaan pada Result<T> dengan transformasi bertipe.
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)
}Pemeriksaan Singkat
Bagaimana Anda menerapkan beberapa batasan pada satu parameter tipe?
Rekapitulasi
Fungsi generik menggunakan parameter tipe untuk menulis kode yang dapat digunakan kembali dan aman bagi tipe. Gunakan : untuk satu batasan atau where untuk beberapa batasan. Kompilator Kotlin memberlakukan batasan tersebut di lokasi pemanggilan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Fungsi Generik dan Batasan Tipe dengan where” gratis?
Ya — teks lengkap “Fungsi Generik dan Batasan Tipe dengan where” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Fungsi Generik dan Batasan Tipe dengan where”?
Tulislah fungsi generik dengan satu atau beberapa batasan tipe. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Fungsi Generik dan Batasan Tipe dengan where” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Fungsi Generik dan Batasan Tipe dengan where
- Variansi di Lokasi Deklarasi: in dan out
- Proyeksi Bintang dan Kapan Menggunakan *
- Penghapusan Tipe dan Parameter Tipe reified