Линия:
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
}
}
Я вижу, спасибо @ Groostav, это имеет смысл, потому что val похож на final в java, я думаю
Если вы знаете, что viewAdapter будет BezinningAdapter, объявите его так:
private lateinit var viewAdapter: BezinningAdapter<*>
Спасибо. он работает, если мне нравится этот private lateinit var viewAdapter: BezinningAdapter без ромба. Итак, я начинаю понимать, причина, по которой я получаю это исключение Smartcast, заключается в том, что я как бы инициализирую его дважды?
Он должен быть преобразован в целом, потому что вы сначала объявили viewAdapter как RecyclerView.Adapter, а затем назначили его BezinningAdapter позже. Smartcast здесь невозможен (для типов var), потому что ссылкой может быть любой подтип RecyclerView.Adapter в любое время.
вы также всегда можете использовать локальные переменные с умным преобразованием. так что что-то вроде
val viewAdapter = BezziningAdapter(); viewAdapter.whatever(); /*...*/ this.viewAdapter = viewAdapterбудет работать в общем случае, так как переменная стекаvalникогда не изменит значение