【问题标题】:Not able to instantiate adapter wrapper because of generics in kotlin由于 kotlin 中的泛型,无法实例化适配器包装器
【发布时间】:2018-06-11 15:05:37
【问题描述】:

由于泛型,我无法将适配器传递给适配器包装类。这是我实例化它的方式

val a = MyAdapter()
val b = AdAdapter(a)

此代码导致错误

Type mismatch: inferred type is MyAdapter but RecyclerView.Adapter
<in RecyclerView.ViewHolder> was expected

这是我的适配器

class MyAdapter: RecyclerView.Adapter<MyAdapter.VH>() {

    //Some Code Here

    class VH(itemView: View): RecyclerView.ViewHolder(itemView) {}

}

这是适配器

class AdAdapter(private val originalAdapter: 
                      RecyclerView.Adapter<in RecyclerView.ViewHolder>)
                      : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    //Some Code

}

【问题讨论】:

  • 如果您反对,请添加评论。很乐意解释/编辑

标签: java android kotlin


【解决方案1】:

https://kotlinlang.org/docs/reference/generics.html#use-site-variance-type-projections 中所述,

Array&lt;in String&gt; 对应于 Java 的 Array&lt;? super String&gt;,即您可以将 CharSequence 数组或 Object 数组传递给 fill() 函数。

因此,在您的情况下,您需要 MyAdapter 成为 RecyclerView.Adapter&lt;? super RecyclerView.ViewHolder&gt; 而不是,因为 MyAdapter.VH 不满足约束。

【讨论】:

  • 如果我用 out 代替 in。我不能在这个适配器上调用 onbindviewholder
  • 您也可以将AdAdapter 设为通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多