Kotlinジェネリックの「*」と「Any」の違い


106

私は完全に違いを理解することを確認していないSomeGeneric<*>としますSomeGeneric<Any>。私*は何でも(ワイルドカード)をAny表し、すべてのオブジェクトが継承するオブジェクトを表すと思います。彼らは同じであるように見えますが、そうですか?

回答:


158

星の投影は、任意のタイプだけでなく、正確に何を知らないいくつかの固定タイプを表す方法として考えると役立つ場合があります。

たとえば、タイプMutableList<*>何かのリストを表します(正確にはわかりません)。したがって、このリストに何かを追加しようとしても、成功しません。Stringsのリスト、sのリストInt、または他のリストです。コンパイラは、リストがこのタイプのオブジェクトを受け入れることを確認できないため、このリストにオブジェクトを配置することをまったく許可しません。ただし、このようなリストから要素を取得しようとすると、タイプのオブジェクトが確実に取得さAny?Anyます。これは、Kotlinのすべてのオブジェクトがから継承されるためです。

以下のascoコメントから:

さらにList<*>、任意のタイプのオブジェクトを含めることができますが、そのタイプのみであるため、文字列(ただし、文字List<Any> 列のみ)を含めることができますが、文字列と整数などをすべて同じリストに含めることができます。


83
良い回答です。List<*>には任意のタイプのオブジェクトを含めることができるが、そのタイプのみを含めることができるため、文字列(ただし文字列のみ)を含めることができる一方で、List <Any>には文字列と整数を含めることができ、何もかも、すべて同じリストにあります。
fweigl 2016年

1
ここでは同様の説明と興味深い記事:typealias.com/guides/star-projections-and-how-they-work
ワニ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.