for (i in position until effectList.size) {
var holder = mRecyclerView.findViewHolderForAdapterPosition(i) as EffectsHolder
holder.bindEffect(holder.effect, i)
}
我的代码导致像这样的空指针转换:
kotlin.TypeCastException: null cannot be cast to non-null type com.mobileer.androidfxlab.EffectsAdapter.EffectsHolder
因为mRecyclerView.findViewHolderForAdapterPosition(i)
返回null。仅当mRecyclerView.findViewHolderForAdapterPosition(i)
不为null时,才能有条件地进行强制转换?然后我可以做holder?.bindEffect(holder.effect, i)
答案 0 :(得分:1)
Kotlin允许您使用Safe (nullable) Cast Operator执行这样的转换:
val maybeString: String? = someObject as? String
所以在您的情况下,也许是这样的:
var holder = mRecyclerView.findViewHolderForAdapterPosition(i) as? EffectsHolder
holder?.bindEffect(holder?.effect, i)
答案 1 :(得分:1)
虽然Kotlin提供了一个安全的强制转换运算符as?
,但是您仍然需要处理空值,并且if you look at the bytecode,as?
有更多说明。
因此,我建议尽可能使用is运算符。它不会在JVM中进行内部转换,而只会对其进行检查,并且该对象实际上已智能广播为cheched类型。
示例:
val holder = mRecyclerView.findViewHolderForAdapterPosition(i)
if (holder is EffectsHolder) {
// use `holder` here, it is smart-casted internally into EffectsHolder
}