Kotlin智能转换不适用于LinearLayout.LayoutParams

我已经实现了一个函数,我曾经传递给anko`s递归应用。

在这个函数里面,我想添加一个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是不可空的,所以为什么聪明的演员不能推断类型?

在这种情况下,智能转换将不起作用,因为检查成功的类型(例如,通过其他线程)可能已经改变了类型检查的类型,如果检查成功了,运行时异常,当你试图转换它。

解决方法是或者像你一样手动进行演员,或者为你的功能引入一个临时的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) } } }