我有一个像这样的界面:
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也提供有关的信息。
解决方案是将字段itemClickListener
和setOnClickListener
的参数声明为ItemClickListener<Item>
,这与类声明<in Item>
的方差相同。因此,您可以使用onClick
的任何子类型调用Item
。
关于generics - 在Kotlin中声明具有泛型边界的类属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49074086/