Kotlin参数类型不匹配

我试图将下面的Java代码转换为Kotlin。 它编译和工作正常。

public abstract class MvpViewHolder<P extends BasePresenter> extends RecyclerView.ViewHolder { protected P presenter; public MvpViewHolder(View itemView) { super(itemView); } public void bindPresenter(P presenter) { this.presenter = presenter; presenter.bindView(this); } public void unbindPresenter() { presenter = null; } } 

在我目前的代码中,我得到了一个presenter.bindView(this)的错误状态Required: Nothing, Found: MvpViewHolder

 abstract class MvpViewHolder<P>(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter<*,*> { protected var presenter: P? = null fun bindPresenter(presenter: P): Unit { this.presenter = presenter //I get the error here presenter.bindView(this) } fun unbindPresenter(): Unit { presenter = null } } 

bindView是这样定义的

 public abstract class BasePresenter<M,V> { fun bindView(view: V) { this.view = WeakReference(view) } } 

我现在唯一可以将它归因于它没有正确定义类泛型。 据我所知, this仍然是预期作为参数的View泛型的一个正确的实例,我也绝对不知道它是如何可能是Nothing 。 我怎样才能修复这个错误?

编辑:BasePresenter的Java代码

 public abstract class BasePresenter<M, V> { protected M model; private WeakReference<V> view; public void bindView(@NonNull V view) { this.view = new WeakReference<>(view); if (setupDone()) { updateView(); } } protected V view() { if (view == null) { return null; } else { return view.get(); } } } 

你的bindView方法需要一个View作为参数。

当你定义一个可以容纳一个空结果的变量(在BasePresenter上定义的view ),或者在你的情况下,一个View对象时,就会出现你所看到的错误。

在下面的代码中,您绑定了this参数,而MapViewHolder不是View的子类。

 abstract class MvpViewHolder<P>(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter<*,*> { protected var presenter: P? = null fun bindPresenter(presenter: P): Unit { this.presenter = presenter //I get the error here presenter.bindView(this) // -> this references MvpViewHolder which isn't a subclass of View } fun unbindPresenter(): Unit { presenter = null } } 

我认为你想要的是将itemView附加到演示者,因为它实际上是一个View对象。

编辑

问题与定义BasePresenter<*,*> ,这意味着在这种情况下BasePresenter<Nothing, Nothing> (Nothing是kotlin中的对象) – 在此链接上阅读更多关于kotlin中的星型投影

我会建议明确定义类型的基本演示者期待或显式定义为BasePresenter<Any?, Any?>

你不能直接用这个指向当前类。

你需要使用

this@class_name

例如,如果“ Example ”是class名称,则可以使用

this@Example

这意味着在Java中

欲了解更多信息,请访问https://kotlinlang.org/docs/reference/this-expressions.html