Kotlin smart cast不适用于LinearLayout.LayoutParams

时间:2017-05-20 13:39:19

标签: android kotlin

我已经实现了一个我曾经传递给anko的applyRecursively的函数。

在这个函数里面,我想添加一个marginEnd是视图在LinearLayout里面,所以我写了下面的代码:

when(view.layoutParams) {
    is LinearLayout.LayoutParams -> {
        view.layoutParams.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

我收到的错误是view.layoutParams是一个可以更改的可变属性。所以我不得不强迫演员:

when(view.layoutParams) {
    is LinearLayout.LayoutParams -> {
        (view.layoutParams as LinearLayout.LayoutParams).marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

在这里看看stackoverflow我看到Kotlin并没有聪明地投入可以为空的变量,但是view.layoutParams不可为空,那么为什么智能投射不能推断出类型?

1 个答案:

答案 0 :(得分:4)

在这种情况下,智能转换将不起作用,因为您执行类型检查的变量的类型可能已经更改,因为该检查成功通过(例如,通过不同的线程),如果确实如此,您' d当您尝试强制转换时,会收到运行时异常。

解决方案是要么像你一样手动执行转换,要么为你的函数引入一个临时的val,智能转换会工作,因为我们知道它的类型不会改变:

val params = view.layoutParams
when(params) {
    is LinearLayout.LayoutParams -> {
        params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

修改:另外请注意,您还可以使用let引入此变量:

view.layoutParams.let { params ->
    when(params) {
        is LinearLayout.LayoutParams -> {
            params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
        }
    }
}
相关问题