Kotlin 제네릭에서 '*'와 'Any'의 차이점


106

SomeGeneric<*>과 의 차이점을 완전히 이해하지 못했습니다 SomeGeneric<Any>. 나는 *무엇이든 (와일드 카드)를 Any나타내며 모든 개체가 상속 하는 개체를 나타냅니다 . 그래서 그들은 동일해야하는 것 같지만, 그렇습니까?

답변:


158

별 투영 을 어떤 유형이 아니라 정확히 무엇인지 모르는 고정 유형을 나타내는 방법으로 생각하면 도움이 될 수 있습니다 .

예를 들어, 유형 MutableList<*>무언가 의 목록을 나타냅니다 (정확하게 무엇인지 알 수 없음). 따라서이 목록에 무언가를 추가하려고하면 성공하지 못할 것입니다. 의 목록, String의 목록 Int또는 다른 항목의 목록 일 수 있습니다. 컴파일러는 목록이이 유형의 개체를 허용하는지 확인할 수 없기 때문에이 목록에 어떤 개체도 넣는 것을 허용하지 않습니다. 그러나 이러한 목록에서 요소를 가져 오려고하면 Any?Kotlin의 모든 개체가 Any.

에서 ASCO의 아래 코멘트 :

또한 List<*>모든 유형의 객체를 포함 할 수 있지만 해당 유형 만 포함 할 수 있으므로 문자열 (단, 문자열 만) List<Any> 을 포함 할 수있는 반면, 문자열과 정수 등을 모두 동일한 목록에 포함 할 수 있습니다.


83
좋은 대답은 List <*>가 모든 유형의 객체를 포함 할 수 있지만 해당 유형 포함 할 수 있으므로 Strings (단지 문자열 만)를 포함 할 수있는 반면 List <Any>는 Strings 및 Integers 및 모두 같은 목록에 있습니다.
fweigl

1
비슷한 설명과 함께 여기에 흥미로운 기사 : typealias.com/guides/star-projections-and-how-they-work
악어

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.