2016-11-15 53 views
3

我有这样的代码:科特林,智能转换是不可能的,因为复杂的表达式

// allocate one mesh 
pScene.mNumMeshes = 1 
pScene.mMeshes = mutableListOf(AiMesh()) 
val pMesh = pScene.mMeshes[0] 

哪里mMeshes是类型的参数

var mMeshes: MutableList<AiMesh>? = null,

编译器的最后一排,在抱怨,我尝试声明pMesh

智能转到MutableList<AiMesh>是不可能的,因为pScene.mMeshes是一个复杂的表达式

什么问题?

+1

是否'VAL pMesh = pScene.mMeshes !! [ 0]'工作?如果是这样,那是因为'mMeshes'是'var'(在赋值后不能保证不为空)。 – hotkey

+0

哦,上帝,是的,我没有想到它..如果你回答我会接受它,谢谢! – elect

回答

10

由于mMeshesvar特性,它可以在pScene.mMeshes[0]mutableListOf(AiMesh())分配和使用之间变化,这意味着它不能保证在使用场所不空。

的编译器强制null-safety,治疗pScene.mMeshes为可为空MutableList<AiMesh>?,而不是让你使用它作为MutableList<AiMesh>(即其不能安全地执行smart cast)。

为了解决这个问题,你可以简单地做一个non-null assertion

val pMesh = pScene.mMeshes!![0] 

或者只是重用你把列表中的值:

val pMesh = AiMesh() 
pScene.mMeshes = mutableListOf(mesh) 
// use `pMesh` below 
+0

或者使用'val pMesh = AiMesh()。apply {pScene.mMeshes = mutableListOf(this)}' –