Tipo de parámetro Kotlin no coincide

Estoy tratando de convertir el siguiente código Java a Kotlin. Comstack y funciona bien.

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; } } 

En el código que tengo actualmente, Requinetworking: Nothing, Found: MvpViewHolder un error en presenter.bindView(this) que indica Requinetworking: 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 se define como tal

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

Lo único que puedo atribuirle ahora no es definir correctamente los generics de class. Por lo que puedo decir, this sigue siendo una instancia correcta de la vista genérica que se espera como el parámetro, también definitivamente no veo cómo podría ser Nothing . ¿Cómo puedo arreglar el error?

EDITAR: código de Java para BasePresenter

 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(); } } } 

Su método bindView requiere una View como argumento.

El error que está viendo aparece cuando define una variable ( view definida en BasePresenter) que puede contener un resultado nulo o, en su caso, un object View.

En el siguiente código, estás vinculando this como argumento y MapViewHolder no es una subclass de Vista.

 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 } } 

Creo que lo que quieres es adjuntar itemView al presentador porque de hecho es un object View .

EDITAR

El problema tiene que ver con la definición de BasePresenter<*,*> que significa en este caso BasePresenter<Nothing, Nothing> (Nothing es un object en kotlin) – lea más sobre las proyecciones de estrellas en kotlin en este enlace.

BasePresenter<Any?, Any?> definir explícitamente los types que el presentador base está esperando o definiendo explícitamente como BasePresenter<Any?, Any?> .

No puede usar esto directamente para apuntar a la class actual.

Tienes que usar

this@class_name

Por ejemplo, si " Example " es el nombre de la class , puede usar

this@Example

Significa this en Java

Para get más información, visite https://kotlinlang.org/docs/reference/this-expressions.html

  • ¿Para qué sirve el campo de apoyo de Kotlin?
  • En Kotlin Lenguaje de progtwigción importancia de varargs en términos de usos
  • Cómo usar null con kotlin @Parcelize
  • Encuadernación con vista de Android Kotlin: findViewById vs Butterknife vs Kotlin Android Extension
  • ¿Qué significa la advertencia «Usar properties de los packages de variante de compilation»?
  • Diálogo personalizado de Kotlin Parámetro especificado como no nulo
  • Función de extensión de llamada dentro de la class Java como cualquier operador de RX
  • La extensión sintética de Kotlin y varias incluyen el mismo layout
  • No se puede networkingucir una list de booleans en kotlin
  • La propiedad en la interfaz no puede tener un campo de respaldo
  • Cómo inicializar widgets en Android usando kotlin