Kotlin参数类型不匹配

时间:2017-10-31 16:48:22

标签: android kotlin kotlin-android-extensions

我正在尝试将以下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();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

您的bindView方法需要View作为参数。

当您定义一个可以保存null结果的变量(在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>(什么都不是kotlin中的对象) - 阅读更多关于kotlin上的星级预测的信息{3}}链接。

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

答案 1 :(得分:0)

您不能直接使用它来指向当前类。

您需要使用

this@class_name

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

this@Example

这意味着Java中的this

有关详细信息,请访问https://kotlinlang.org/docs/reference/this-expressions.html