Differenza tra "*" e "Qualsiasi" nei generici Kotlin


107

Non sono sicuro di aver compreso appieno la differenza tra SomeGeneric<*>e SomeGeneric<Any>. Penso che *rappresenti qualsiasi cosa (carattere jolly) e Anyrappresenta l'oggetto da cui ereditano TUTTI gli oggetti. Quindi sembra che dovrebbero essere gli stessi, ma lo sono?

Risposte:


159

Può essere utile pensare alla proiezione stellare come a un modo per rappresentare non solo un tipo qualsiasi, ma un tipo fisso di cui non sai cosa sia esattamente.

Ad esempio, il tipo MutableList<*>rappresenta l'elenco di qualcosa (non sai cosa esattamente). Quindi se provi ad aggiungere qualcosa a questo elenco, non ci riuscirai. Può essere un elenco di Strings, o un elenco di Ints, o un elenco di qualcos'altro. Il compilatore non consentirà affatto di inserire alcun oggetto in questo elenco perché non può verificare che l'elenco accetti oggetti di questo tipo. Tuttavia, se si tenta di estrarre un elemento da tale elenco, si otterrà sicuramente un oggetto di tipo Any?, perché tutti gli oggetti in Kotlin ereditano da Any.

Dal commento di asco di seguito:

Inoltre List<*>può contenere oggetti di qualsiasi tipo, ma solo quel tipo, quindi può contenere stringhe (ma solo stringhe), mentre List<Any> può contenere stringhe e numeri interi e quant'altro, tutti nella stessa lista.


83
Bella risposta, per alcuni può essere utile aggiungere che List <*> può contenere oggetti di qualsiasi tipo, ma solo quel tipo, quindi può contenere stringhe (ma solo stringhe), mentre List <Any> può contenere stringhe e interi e cosa, tutto nella stessa lista.
fweigl

1
Ecco un articolo interessante con una spiegazione simile: typealias.com/guides/star-projections-and-how-they-work
croc

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.