Исключение условий гонки в Котлине, Smartcast невозможно исключение во время выполнения

Линия:

viewAdapter.setTitleData(bezinningModels)

в приведенном ниже фрагменте выдает предупреждение во время выполнения:

Smart cast to 'BezinningAdapter' is impossible, because 'viewAdapter' is a mutable property that could have been changed by this time

Я просмотрел много сообщений с аналогичным предупреждением во время выполнения и понял, почему это происходит. В основном Kotlin хочет избежать условий гонки, чтобы значение изменяемого объекта не могло измениться, но все же я не понимаю, что я должен делать, чтобы избежать этой ошибки, чтобы я мог вызвать вызов модернизации в RecyclerView Array. Я попытался изменить значение var с val на RecyclerView, но это не сработало.

Вот фрагмент, вызывающий проблему:

@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
class MainFragment : android.app.Fragment() {




private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var recyclerView: RecyclerView

private lateinit var viewAdapter: RecyclerView.Adapter<*>

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    val view = inflater!!.inflate(R.layout.bezinning_fragment, container, false)

   viewManager=LinearLayoutManager(activity)
    viewAdapter=BezinningAdapter()

    recyclerView = view.findViewById(R.id.recycler_view) as RecyclerView
    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager=viewManager
    recyclerView.adapter=viewAdapter


    val subscribe = bezinningListViewModel!!.showBezinningLijst("132")
            ?.subscribeOn(schedulerProvider!!.io())
            ?.observeOn(schedulerProvider!!.ui())
            ?.subscribe(object : FlowableSubscriber<List<BezinningModel>> {
                override fun onError(t: Throwable?) {
                    Log.d("IVO", "onError: ")
                }

                override fun onComplete() {
                    Log.d("IVO", "onComplete: ")
                }

                override fun onSubscribe(s: Subscription) {
                    s.request(Long.MAX_VALUE);

                }

                override fun onNext(bezinningModels: List<BezinningModel>?) 
   {

                    val JSONResponseBody = bezinningModels!! 
[0].attribute.body
                    viewAdapter.setTitleData(bezinningModels)


                    val bodyBezinningParsedHtml = 
Html.fromHtml(JSONResponseBody)



                }


            })

    return view

}



}

вы также всегда можете использовать локальные переменные с умным преобразованием. так что что-то вроде val viewAdapter = BezziningAdapter(); viewAdapter.whatever(); /*...*/ this.viewAdapter = viewAdapter будет работать в общем случае, так как переменная стека val никогда не изменит значение

Groostav 21.08.2018 00:19

Я вижу, спасибо @ Groostav, это имеет смысл, потому что val похож на final в java, я думаю

Drocchio 27.08.2018 18:22
1
2
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы знаете, что viewAdapter будет BezinningAdapter, объявите его так:

private lateinit var viewAdapter: BezinningAdapter<*>

Спасибо. он работает, если мне нравится этот private lateinit var viewAdapter: BezinningAdapter без ромба. Итак, я начинаю понимать, причина, по которой я получаю это исключение Smartcast, заключается в том, что я как бы инициализирую его дважды?

Drocchio 20.08.2018 19:14

Он должен быть преобразован в целом, потому что вы сначала объявили viewAdapter как RecyclerView.Adapter, а затем назначили его BezinningAdapter позже. Smartcast здесь невозможен (для типов var), потому что ссылкой может быть любой подтип RecyclerView.Adapter в любое время.

natonomo 20.08.2018 19:22

Другие вопросы по теме