我正在使用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
对象)强制转换为GridAdapter
class,如下所示:
(gridView.adapter as GridAdapter).addImage(imageView)
尽管addImage
没有被声明为static,但这是一个方法签名:
fun addImage(image: ImageView)
在我看来,这是一个毫无意义的声明,在任何其他情况下都会立即导致编译错误,但Android Studio linter却对此深信不疑。为什么?这里发生了什么?
1条答案
按热度按时间cunj1qz11#
GridView
的适配器是ListAdapter
(从AbsListView
继承):无论何时访问
gridView.adapter
,从编译器的Angular 来看,您将得到一个ListAdapter
,而不是您的GridAdapter
,因为您知道它在运行时始终是GridAdapter
,所以您可以强制转换它而不会冒ClassCastException
的风险。addImage
似乎是GridAdapter
中的一个函数,因此需要强制转换才能调用该函数。ListAdapter
根本没有该函数。与其每次都强制转换,为什么不保留一个对
GridAdapter
的引用并使用那个引用呢?