kotlin 为什么必须将自定义适配器对象强制转换为类?

s3fp2yjn  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(108)

我正在使用Kotlin开发一个简单的Android应用程序,目前正在实现android.widget.BaseAdapter的一个自定义子类。我的类GridAdapter与一个GridView相关联,我已经在activity_main.xml中定义了GridView。我将它附加到MainActivity.kt中,如下所示:

val gridView = findViewById<GridView>(R.id.gridView)
gridView.adapter = GridAdapter(applicationContext)

我不明白的是,每当我想调用适配器的某个函数时,我必须首先将它(一个GridAdapter对象)强制转换为GridAdapterclass,如下所示:

(gridView.adapter as GridAdapter).addImage(imageView)

尽管addImage没有被声明为static,但这是一个方法签名:

fun addImage(image: ImageView)

在我看来,这是一个毫无意义的声明,在任何其他情况下都会立即导致编译错误,但Android Studio linter却对此深信不疑。为什么?这里发生了什么?

cunj1qz1

cunj1qz11#

GridView的适配器是ListAdapter(从AbsListView继承):

ListAdapter mAdapter;

无论何时访问gridView.adapter,从编译器的Angular 来看,您将得到一个ListAdapter,而不是您的GridAdapter,因为您知道它在运行时始终是GridAdapter,所以您可以强制转换它而不会冒ClassCastException的风险。
addImage似乎是GridAdapter中的一个函数,因此需要强制转换才能调用该函数。ListAdapter根本没有该函数。
与其每次都强制转换,为什么不保留一个对GridAdapter的引用并使用那个引用呢?

val adapter = GridAdapter(applicationContext)
gridView.adapter = adapter
adapter.addImage(imageView)

相关问题