【问题标题】:Kotlin, smart cast is impossible because of complex expressionKotlin,由于复杂的表达,智能演员是不可能的
【发布时间】:2016-11-15 14:43:57
【问题描述】:

我有这个代码:

// 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 是一个复杂的表达式

有什么问题?

【问题讨论】:

  • val pMesh = pScene.mMeshes!![0] 有效吗?如果是,那是因为mMeshesvar(赋值后不保证不为空)。
  • 天哪,是的,我没想到。如果你回答我会接受,谢谢!

标签: kotlin


【解决方案1】:

由于mMeshesvar属性,它可以在mutableListOf(AiMesh())的赋值和pScene.mMeshes[0]中的用法之间变化,也就是说在使用现场不保证不为空。

编译器强制执行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

【讨论】:

  • 或者使用类似val pMesh = AiMesh().apply { pScene.mMeshes = mutableListOf(this) }
猜你喜欢
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2012-09-06
  • 2018-03-23
  • 2017-10-20
相关资源
最近更新 更多