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