Saya tidak yakin sepenuhnya memahami perbedaan antara SomeGeneric<*>
dan SomeGeneric<Any>
. Saya pikir *
mewakili apa saja (kartu liar) dan Any
mewakili objek yang diwarisi oleh SEMUA objek. Jadi sepertinya mereka harus sama, tapi benarkah?
Saya tidak yakin sepenuhnya memahami perbedaan antara SomeGeneric<*>
dan SomeGeneric<Any>
. Saya pikir *
mewakili apa saja (kartu liar) dan Any
mewakili objek yang diwarisi oleh SEMUA objek. Jadi sepertinya mereka harus sama, tapi benarkah?
Jawaban:
Mungkin berguna untuk memikirkan proyeksi bintang sebagai cara untuk mewakili bukan sembarang jenis, tetapi beberapa jenis tetap yang Anda tidak tahu persisnya.
Misalnya, tipe MutableList<*>
mewakili daftar sesuatu (Anda tidak tahu persis apa). Jadi, jika Anda mencoba menambahkan sesuatu ke daftar ini, Anda tidak akan berhasil. Ini mungkin daftar String
s, atau daftar Int
s, atau daftar sesuatu yang lain. Kompilator tidak akan mengizinkan untuk meletakkan objek apa pun dalam daftar ini sama sekali karena tidak dapat memverifikasi bahwa daftar menerima objek jenis ini. Namun, jika Anda mencoba untuk mengeluarkan elemen dari daftar tersebut, Anda pasti akan mendapatkan objek bertipe Any?
, karena semua objek di Kotlin mewarisi Any
.
Dari asco komentar di bawah ini:
Selain itu
List<*>
dapat berisi objek dari jenis apa pun, tetapi hanya jenis itu, sehingga dapat berisi String (tetapi hanya String), sementaraList<Any>
dapat berisi Strings dan Integer dan yang lainnya, semua dalam daftar yang sama.
Dalam konteks yang saya pikir Anda menyiratkan, SomeGeneric<*>
setara dengan SomeGeneric<out Any?>
. Setara dengan Java adalah SomeGeneric<? extends Object>
.
Sintaksnya disebut "proyeksi-bintang". Berikut adalah dokumen resminya: https://kotlinlang.org/docs/reference/generics.html#star-projections