Variansi di Lokasi Penggunaan
Proyeksi tipe
Variansi di Lokasi Penggunaan adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
Varians di Titik Penggunaan
Terkadang sebuah kelas generik secara keseluruhan bersifat invarian, tetapi fungsi tertentu hanya menghasilkan atau hanya menerima tipe tersebut. Varians di titik penggunaan (proyeksi tipe) menerapkan out atau in tepat di tempat suatu tipe digunakan.
Mengapa Menggunakan Varians di Titik Penggunaan
Kelas invarian seperti MutableList<T> tidak dapat dibuat kovarian pada deklarasinya karena kelas tersebut membaca dan menulis T. Namun, fungsi tertentu mungkin hanya membaca darinya, dan proyeksi memungkinkan kita menyatakannya dengan aman.
Proyeksi out
Menulis Array<out T> sebagai tipe parameter menghasilkan tampilan kovarian: Anda dapat membaca T, tetapi tidak dapat menulis ke dalamnya. Dengan demikian, Anda dapat meneruskan Array<String> ketika Array<out Any> diharapkan.
fun printArray(items: Array<out Any>) {
for (item in items) println(item)
}
fun main() {
val names: Array<String> = arrayOf("Ann", "Bob")
printArray(names)
}Hanya Membaca
Dengan proyeksi out, kompilator mengizinkan pembacaan (keluaran), tetapi melarang penulisan (masukan), karena penulisan dapat melanggar keamanan tipe pada larik asli.
Proyeksi in
Menulis Array<in T> menghasilkan tampilan kontravarian: Anda dapat menulis nilai bertipe tersebut ke dalamnya, tetapi hasil pembacaan dikembalikan sebagai Any?. Dengan demikian, Anda dapat menerima larik bertipe tersebut atau supertipe apa pun.
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())
}Hanya Menulis
Dengan proyeksi in, Anda dapat menulis nilai bertipe tersebut (masukan), tetapi tipe elemennya dipandang sebagai tipe paling umum saat dibaca, karena tipe elemen sebenarnya dapat berupa supertipe apa pun.
Proyeksi vs Varians di Deklarasi
Varians di deklarasi (class Box<out T>) berlaku di setiap tempat kelas digunakan. Proyeksi di titik penggunaan (Box<out T> sebagai parameter) hanya berlaku di satu tempat tersebut. Gunakan proyeksi ketika kelas itu sendiri harus tetap invarian.
Proyeksi Bintang
Jika Anda sama sekali tidak memedulikan argumen tipe, gunakan proyeksi bintang *. List<*> berarti daftar dengan tipe tertentu yang tidak diketahui; Anda dapat membaca elemennya sebagai batas atas, tetapi tidak dapat menulis dengan aman.
fun printSize(collection: List<*>) {
println("Size: ${collection.size}")
}
fun main() {
printSize(listOf(1, 2, 3))
printSize(listOf("a", "b"))
}Batasan Proyeksi Bintang
Dengan *, Anda tetap dapat memanggil anggota yang tidak bergantung pada tipe (seperti size) dan membaca elemen sebagai Any?, tetapi Anda tidak dapat menambahkan elemen karena tipe sebenarnya tidak diketahui.
fun main() {
val unknown: List<*> = listOf("x", "y")
val first: Any? = unknown.first()
println(first)
}Memilih Proyeksi
Gunakan out T ketika fungsi hanya membaca, in T ketika fungsi hanya menulis, dan * ketika tipe persisnya tidak relevan. Proyeksi ini membuat kelas invarian tetap dapat digunakan secara fleksibel dan aman terhadap tipe.
Hubungan dengan Wildcard Java
Proyeksi Kotlin out T dan in T dipetakan ke wildcard Java ? extends T dan ? super T. Jika Anda memahami generik Java, proyeksi akan terasa tidak asing.
Pemeriksaan Singkat
Apa yang dapat Anda lakukan dengan parameter bertipe Array<out Any>?
Ringkasan
Variansi pada lokasi penggunaan menerapkan proyeksi out (hanya baca) atau in (hanya tulis) pada penggunaan tertentu, serta * sebagai proyeksi bintang ketika tipe tidak diketahui. Hal ini membuat kelas invarian menjadi fleksibel tanpa mengubah deklarasinya. Selanjutnya, Anda akan membatasi parameter tipe dengan batasan generik.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Variansi di Lokasi Penggunaan” gratis?
Ya — teks lengkap “Variansi di Lokasi Penggunaan” 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 “Variansi di Lokasi Penggunaan”?
Proyeksi 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 3 dari 4.
Berapa lama pelajaran “Variansi di Lokasi Penggunaan” 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 dan Kelas Generik
- Variansi di Lokasi Deklarasi
- Variansi di Lokasi Penggunaan
- Batasan Generik