0Pricing
Kotlin Academy · Pelajaran

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

  1. Fungsi dan Kelas Generik
  2. Variansi di Lokasi Deklarasi
  3. Variansi di Lokasi Penggunaan
  4. Batasan Generik
← Kembali ke Kotlin Academy