2017-05-20 5 views
0

私はankoのapplyRecursivelyに渡した関数を実装しました。LinearLayout.LayoutParamsのKotlinスマートキャストが機能しません

この関数内、私は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) 
    } 
} 

私はKotlinがNULL可能であることができ、変数でスマートキャストがないことを見たのstackoverflowで、ここで探しているが、view.layoutParamsはNULL可能ではないので、なぜスマートキャストができますタイプを推測しない?

+0

オム、エラーメッセージが言うように、それは、変更可能だから? Nullabilityはスマートキャストとは関係ありません。 – yole

答えて

4

タイプチェックを行った変数のタイプが変更された可能性があるため、スマートキャストは機能しません(別のスレッドなど)。それをキャストしようとすると実行時例外が発生します。

ソリューションは、どちらかは、あなたが行ったように、手動でキャストを行うために、または我々はその型が変更されないことを知っているので、スマートキャストは、上で動作しますあなたの関数への一時的な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) 
     } 
    } 
} 
関連する問題