Perbedaan antara "*" dan "Any" di Kotlin generik

107

Saya tidak yakin sepenuhnya memahami perbedaan antara SomeGeneric<*>dan SomeGeneric<Any>. Saya pikir *mewakili apa saja (kartu liar) dan Anymewakili objek yang diwarisi oleh SEMUA objek. Jadi sepertinya mereka harus sama, tapi benarkah?

Pembuat Roda
sumber

Jawaban:

159

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 Strings, atau daftar Ints, 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), sementara List<Any> dapat berisi Strings dan Integer dan yang lainnya, semua dalam daftar yang sama.

Alexander Udalov
sumber
83
Jawaban bagus, untuk beberapa mungkin berguna untuk menambahkan bahwa List <*> dapat berisi objek dari tipe apa pun , tetapi hanya tipe itu, sehingga dapat berisi Strings (tetapi hanya Strings), sementara List <Any> dapat berisi Strings dan Integer dan yang lainnya, semua dalam daftar yang sama.
fweigl
1
Berikut artikel menarik dengan penjelasan serupa: typealias.com/guides/star-projections-and-how-they-work
croc