在MutableList声明的括号中添加“ out”前缀时会发生什么?

问题描述

我尝试了以下代码:

var listHippo: MutableList<Hippo> = mutableListOf<Hippo>()
var listAnimal : MutableList<out Animal> = listHippo 

我知道这段代码可能会导致问题(如果有人尝试不添加Hippo对象),但是正在编译该代码。 当尝试使用 listAnimal 变量的添加方法时,我没有标准的添加方法,而是使用了一个参数类型为 Nothing 的方法。 我的问题是: 1.为什么在尝试获取有关此方法的信息(Ctrl +鼠标左键)时,为什么要将我带到标准的 add 方法? 2.如果 Nothing 没有构造函数并因此可以启动,如何通过添加方法将 Nothing 对象添加到 MutableList 中? 附上我在IDE中看到的屏幕截图:

enter image description here

解决方法

您不能那样做,如果您添加了不是河马的Animal,那么您将获得RuntimeException,特别是ClassCastException。

正确的方法:

val hippos = mutableListOf<Hippo>()

// Shallow copy all of the elements present in `hippos`
val animals: MutableList<Animal> = hippos.toMutableList()

这样,如果您向动物添加了一些东西,hippos中存在的列表引用将不会受到影响,因此是有效的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...