记录一个很奇怪的Kotlin和Java的兼容问题(求大神解答)

89 阅读1分钟

在写RecyclerView的时候,内部类的ViewHolder使用了以下写法:

class ViewHolder(val itemView: View): RecyclerView.ViewHolder(itemView) {
  ...
}

然后在onBindViewHolder中使用了一个方法:

private fun f(holder: ViewHolder, position: Int) {
  ...
  val layoutParams = holder.itemView.layoutParams
  ...
}

然后在val layoutParams = holder.itemView.layoutParams 这里发生了Crash,报错信息为: ava.lang.IllegalAccessError,说我的ViewHolder.itemView对我的Adapter是inaccessible的。

这个Crash并不是必现的,甚至可以说只有在非常少的机型会出现。线上没有任何崩溃日志与这个相关,但是被RD自测出来了。

这段逻辑看起来并没有任何问题,初始化内部类时设置了一个成员变量itemView,并且使用这个itemView初始化了他的父类RecyclerView.ViewHolder。

去掉val后,这个崩溃就不会复现了,所以初步怀疑是因为这个val的原因,在使用itemView的时候,实际上是使用了java代码中RecyclerView.ViewHolder的public final View itemView,这种Java和Kotlin代码混合使用的过程中,发生了这个Crash。