web-dev-qa-db-ja.com

プロパティにオープンゲッターまたはカスタムゲッターがあるため、スマートキャストは不可能です

私はコトリンを学んでいます。私のコードは次のとおりです:

_override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    decoupler.attachNotifier(this)
    if(activity is ScreenRouter) {
        decoupler.attachRouter(activity)
    }
}
_

attachRouter()メソッド:

_ fun attachRouter(router: ScreenRouter?) {
    this.router = router
}
_

documentation で記述されているように、kotlinはis演算子でチェックした後、自動的に型にキャストされます。だから、私はそれがうまくいくと期待していました。しかし、代わりにそれはコンパイルエラーで私を悩ませています:

ScreenRouterはオープンまたはカスタムのゲッターを持つプロパティであるため、activityへのスマートキャストは不可能です。

エラーはおそらくアクティビティがnull可能になる可能性があるためだと思ったので、試してみました:

_if(activity!=null && activity is ScreenRouter) {
     decoupler.attachRouter(activity)
}
_

しかし、それは機能せず、コンパイルは同じエラーで失敗しました。

ただし、次のコードは正常に機能します。

_if(activity is ScreenRouter) {
    decoupler.attachRouter(activity as ScreenRouter)
}
_

その大丈夫ですが、上記のエラーは、スマートキャストが失敗する理由について何も説明していないようです。私はKotlinのエキスパートではありません。私はKotlinを学ぶ初心者です。ドキュメントはどこにも見つかりませんでした。これらの種類のエラーの説明は、Kotlinを学ぶのを恐ろしくします。誰かが簡単な言葉で説明できますか?

29
Krupal Shah

nullableオブジェクトであるアクティビティを直接使用する代わりに、私はこれを行いました

activity?.let{
   if(it is ScreenRouter) {
      decoupler.attachRouter(it)
   }
}
2
Shyam Sunder