Kotlin泛型中`*`与`Any`的区别:星号 vs Any
大家好!我最近开始学习Kotlin,在泛型中遇到了一个令人困惑的地方。
在文档中我看到,可以在泛型中使用`*`(star projection),也可以写成``。乍一看,它们似乎做的是同一件事——允许在集合中存储任何类型。但我感觉它们之间存在一些重要的区别。
例如,我写了这样的代码:
```kotlin
val list1: MutableList = mutableListOf("字符串", 42, 3.14)
val list2: MutableList<*> = mutableListOf("字符串", 42, 3.14)
```
两个变量都能工作,我可以向其中添加任何元素。但如果我尝试读取元素并将其赋值给一个具体类型的变量,就会出现奇怪的情况。
如果我写:
```kotlin
val item1: String = list1[0] // 编译错误?还是没有?
val item2: String = list2[0] // 这里呢?
```
第一个版本可以编译,而第二个版本不行。为什么会这样?`*`和`Any`之间到底有什么区别?什么时候该用哪个?请解释一下,谢谢。