当在assign的右侧强制转换变量时,我惊讶地意识到该变量仍然表现为强制类型,而不是最初定义的类型。我是在做错什么还是编译器问题?
码:
val hippoList = listOf<Hippo>(Hippo())
val hippoMutableList : MutableList<Hippo> = hippoList as MutableList<Hippo>
hippoList.add(Hippo())
由于hippoList来自List类型,因此它是不可变的。那么,如何在不可变类型上运行add函数不会导致编译错误?
如果要进行强制转换,则意味着您不仅仅对编译器了解这种执行上下文,而且还告诉编译器此hippoList是MutableList,所以在每次使用hippoList时,编译器都已经知道该对象必须是MutableList并允许您使用add
method,因为您之前已将其强制转换为MutableList。实际上,您会收到一个运行时错误UnsupportedOperationException
,这意味着您实际上对执行上下文一无所知,并且做错了什么。因此,与其使用自己的强制转换,不如让编译器来完成它。
在您的情况下,而不是强制转换为MutableList,请使用以下命令将hippoList转换为MutableList hippoList.toMutableList()
当您使用!!
从可为null的类型到非null的类型时,或者当您对编译器了解的执行上下文了解更多时,也会发生相同的情况。这是一个小例子
val someNullableType: String? = null
val thisStringIsNotNull = someNullableType!!
通过使用 !!在someNullableType上,我们告诉编译器someNullableType也不为null,因此我们被允许写(例如,在您告诉您List也是MutableList的情况下)
someNullableType.length
但是我们会更早收到异常(在我们使用!!来调整编译器的地方)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句