我正在编写一个扩展函数来RecyclerView设置LayoutManager和Adapter设置RecyclerView。该函数应该接受任何扩展自的适配器类,RecyclerView.Adapter<Any>就像我们在 Java 中使用的那样RecyclerView.Adapter<?>。我们如何在 Kotlin 中实现这一点?internal fun <T : RecyclerView.Adapter<Any>> RecyclerView.initAndSetAdapter(context: Context, adapter: T) { this.layoutManager = LinearLayoutManager(context) this.setHasFixedSize(true) this.adapter = adapter}由于类型无效,对此方法的函数调用未编译。但如果我更改Any为*,则它可以正常工作。internal fun <T : RecyclerView.Adapter<*>> RecyclerView.initAndSetAdapter(context: Context, adapter: T) { this.layoutManager = LinearLayoutManager(context) this.setHasFixedSize(true) this.adapter = adapter}为什么方法调用不与类一起编译?Kotlin 中的每个类都像 Java类一样Any扩展类吗?AnyObject
3 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
根据文档: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html
Every Kotlin class has Any as a superclass.
话虽这么说 - 适配器采用的类需要从 ViewHolder 扩展。
慕标5832272
TA贡献1966条经验 获得超4个赞
RecyclerView.Adapter<Any>
相当于 Java RecyclerView.Adapter<Object>
,但与RecyclerView.Adapter<?>
. 特别是,如果你有类似的东西
class AnAdapter extends RecyclerView.Adapter<SomeType>
then是(在 Java 中)AnAdapter
的子类型,而不是( )的子类型。因此,您不能将 的实例传递给需要 的子类型的方法。RecyclerView.Adapter<*>
?
RecyclerView.Adapter<Any>
Object
AnAdapter
RecyclerView.Adapter<Any>
汪汪一只猫
TA贡献1898条经验 获得超8个赞
RecyclerView.Adapter 的类型必须是 ViewHolder 或 ViewHolder 子类。这是在类中定义的,您不能将其范围扩展到 Any 或 Object。这将违背泛型的目的。通过使用星形投影,它会自动使用类定义的最大边界<out ViewHolder>/<in Nothing>
。
添加回答
举报
0/150
提交
取消