2016-11-15 3 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)}' –