我有一个像这样的界面:

interface ItemClickListener<in T : Item> {
    fun onClick(item: T)
}

我有一堂这样的课:
abstract class MyClass {
    private var itemClickListener: ItemClickListener<*>? = null

    fun <I : Item> setOnClickListener(clickListener: ItemClickListener<I>) {
        this.itemClickListener = clickListener
    }
}

稍后,如果我要使用该侦听器,它将失败:
itemClickListener?.onClick(item)

我得到:



在类上声明itemClickListener属性的正确方法是什么?

最佳答案

遵循星形投影的Kotlin reference:



出现错误消息的原因是ItemClickListener<in T: Item>的星形投影是ItemClickListener<in Nothing>,无法使用任何参数调用它。 This question也提供有关的信息。

解决方案是将字段itemClickListenersetOnClickListener的参数声明为ItemClickListener<Item>,这与类声明<in Item>的方差相同。因此,您可以使用onClick的任何子类型调用Item

关于generics - 在Kotlin中声明具有泛型边界的类属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49074086/

10-12 03:20