如何在Kotlin中安全地投射(无null投射)

时间:2020-05-24 20:39:38

标签: kotlin

    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)

2 个答案:

答案 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 bytecodeas?有更多说明。

因此,我建议尽可能使用is运算符。它不会在JVM中进行内部转换,而只会对其进行检查,并且该对象实际上已智能广播为cheched类型。

示例:

val holder = mRecyclerView.findViewHolderForAdapterPosition(i)
if (holder is EffectsHolder) {
    // use `holder` here, it is smart-casted internally into EffectsHolder
}