猿问

Kotlin 中的每个类都扩展任何类吗

我正在编写一个扩展函数来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


Smart猫小萌
浏览 123回答 3
3回答

慕侠2389804

根据文档:&nbsp;https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.htmlEvery Kotlin class has Any as a superclass.话虽这么说 - 适配器采用的类需要从 ViewHolder 扩展。

慕标5832272

RecyclerView.Adapter<Any>相当于 Java RecyclerView.Adapter<Object>,但与RecyclerView.Adapter<?>. 特别是,如果你有类似的东西class AnAdapter extends RecyclerView.Adapter<SomeType>then是(在 Java 中)AnAdapter的子类型,而不是( )的子类型。因此,您不能将 的实例传递给需要 的子类型的方法。RecyclerView.Adapter<*>?RecyclerView.Adapter<Any>ObjectAnAdapterRecyclerView.Adapter<Any>

汪汪一只猫

RecyclerView.Adapter 的类型必须是 ViewHolder 或 ViewHolder 子类。这是在类中定义的,您不能将其范围扩展到 Any 或 Object。这将违背泛型的目的。通过使用星形投影,它会自动使用类定义的最大边界<out ViewHolder>/<in Nothing>。
随时随地看视频慕课网APP

相关分类

Java
我要回答