Kotlin jeneriklerinde "*" ve "Herhangi biri" arasındaki fark


107

Ben tamamen arasındaki farkı anlamak için emin değilim SomeGeneric<*>ve SomeGeneric<Any>. Sanırım *herhangi bir şeyi temsil ediyor (joker karakter) ve TÜM nesnelerin miras Anyaldığı nesneyi temsil ediyor . Görünüşe göre aynı olmalılar, ama öyle mi?

Yanıtlar:


159

Yıldız projeksiyonunu yalnızca herhangi bir türü değil, tam olarak ne olduğunu bilmediğiniz sabit bir türü temsil etmenin bir yolu olarak düşünmek yardımcı olabilir .

Örneğin, tür MutableList<*>, bir şeyin listesini temsil eder (tam olarak ne olduğunu bilmiyorsunuz). Yani bu listeye bir şey eklemeye çalışırsanız, başaramazsınız. Bir e listesi Stringveya bir e listesi Intveya başka bir şeyin listesi olabilir. Derleyici, listenin bu tür nesneleri kabul ettiğini doğrulayamayacağı için bu listeye herhangi bir nesne koymaya izin vermez. Bununla birlikte, bu listeden bir öğe çıkarmaya çalışırsanız, kesinlikle bir nesne türü elde edersiniz Any?, çünkü Kotlin'deki tüm nesneler öğeden miras alır Any.

Gönderen asco aşağıda yorum:

Ek olarak List<*>, herhangi bir türden, ancak yalnızca bu türden nesneler içerebilir, bu nedenle Dizeler (ancak yalnızca Dizeler) List<Any> içerebilirken, Dizeler ve Tamsayılar ve hepsi aynı listede olabilir.


83
Güzel yanıt, bazıları için List <*> 'nin herhangi bir türden nesneyi içerebileceğini , ancak yalnızca bu türden nesneler içerebileceğini eklemek yararlı olabilir , böylece Dizeler (ancak yalnızca Dizeler) içerebilirken, Liste <Herhangi biri> Dizeleri ve Tamsayıları içerebilir ve whatnot, hepsi aynı listede.
fweigl

1
İşte benzer bir açıklama ile ilginç bir makale: typealias.com/guides/star-projections-and-how-they-work
croc

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.