Batasan Generik
Batasi parameter tipe
Batasan Generik adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Membatasi Parameter Tipe
Terkadang sebuah generik hanya boleh menerima tipe tertentu, misalnya tipe yang dapat dibandingkan atau yang merupakan subkelas dari suatu kelas dasar. Batasan generik menetapkan batas atas untuk sebuah parameter tipe.
Batas Atas Bawaan
Tanpa batasan, batas atas parameter tipe adalah Any?, sehingga parameter tersebut menerima tipe apa pun, termasuk tipe yang dapat bernilai null. Agar hanya mengizinkan tipe yang tidak dapat bernilai null, batasi dengan Any.
fun <T : Any> requireNonNull(value: T): T {
return value
}
fun main() {
println(requireNonNull(42))
}Satu Batas Atas
Gunakan T : Bound untuk mengharuskan T menjadi subtipe dari Bound. Dengan demikian, Anda dapat memanggil anggota batas tersebut di dalam fungsi.
fun <T : Number> sumDoubled(a: T, b: T): Double {
return a.toDouble() * 2 + b.toDouble() * 2
}
fun main() {
println(sumDoubled(3, 4))
println(sumDoubled(1.5, 2.5))
}Batas Comparable
Batas yang umum digunakan adalah Comparable<T>, yang memungkinkan Anda membandingkan elemen dengan <, >, atau compareTo.
fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
return if (a > b) a else b
}
fun main() {
println(maxOf2(3, 9))
println(maxOf2("apple", "banana"))
}Memanggil Anggota Batas
Di dalam generik yang memiliki batasan, kompilator mengetahui bahwa T memiliki API dari batas tersebut, sehingga Anda dapat langsung memanggil metodenya tanpa melakukan konversi tipe.
fun <T : CharSequence> describe(value: T): String {
return "Length is ${value.length}"
}
fun main() {
println(describe("hello"))
println(describe(StringBuilder("hi")))
}Beberapa Batas dengan where
Untuk lebih dari satu batas, gunakan klausa where. T kemudian harus memenuhi SEMUA batasan yang tercantum.
fun <T> copyWhenValid(value: T): T
where T : CharSequence, T : Comparable<T> {
return value
}
fun main() {
println(copyWhenValid("text"))
}Batasan pada Kelas
Batasan juga berlaku pada kelas generik, dengan membatasi tipe yang dapat digunakan untuk membuat instans kelas tersebut.
class NumberBox<T : Number>(val value: T) {
fun asDouble(): Double = value.toDouble()
}
fun main() {
val box = NumberBox(10)
println(box.asDouble())
}Batasan Mengaktifkan Operasi
Tujuan utama batasan adalah membuka akses ke berbagai operasi. Tanpa T : Number, Anda tidak dapat memanggil toDouble(); batas tersebut menjamin bahwa metode itu tersedia.
Batas Tidak Dapat Bernilai Null dalam Praktik
Membatasi dengan Any menolak argumen yang dapat bernilai null saat kompilasi, cara praktis untuk mengharuskan generik yang tidak dapat bernilai null.
fun <T : Any> firstNonNull(a: T, b: T): T = a
fun main() {
println(firstNonNull("x", "y"))
// firstNonNull(null, "y") would not compile
}Menggabungkan dengan Variansi
Batasan dan variansi menyelesaikan masalah yang berbeda: variansi (in/out) mengatur hubungan subtipe, sedangkan batasan (batas : dan where) membatasi tipe yang diizinkan. Keduanya dapat digunakan bersama.
Merancang Batasan yang Baik
Tambahkan batasan hanya ketika Anda memerlukan kemampuan tertentu dari tipe tersebut. Batasan yang terlalu ketat mengurangi penggunaan ulang; batasan yang terlalu longgar memaksa Anda melakukan konversi tipe. Gunakan tipe paling umum yang menyediakan operasi yang Anda gunakan sebagai batas.
Pemeriksaan Singkat
Bagaimana cara mengharuskan sebuah parameter tipe memenuhi lebih dari satu batas?
Ringkasan
Batasan generik menetapkan batas atas dengan T : Bound (atau where untuk beberapa batas), sehingga operasi dari batas tersebut tersedia dan tipe yang tidak sesuai dikecualikan. Membatasi dengan Any mengharuskan nilai tidak dapat bernilai null. Jika digabungkan dengan variansi, batasan memungkinkan Anda merancang generik yang aman dan ekspresif. Kursus Generik dan Variansi ini telah selesai.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Batasan Generik” gratis?
Ya — teks lengkap “Batasan Generik” 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 “Batasan Generik”?
Batasi parameter 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 4 dari 4.
Berapa lama pelajaran “Batasan Generik” 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.