Avatar ·

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`之间到底有什么区别?什么时候该用哪个?请解释一下,谢谢。