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

  • Cómo pasar el nombre de db en time de ejecución en kotlin
  • Obteniendo exception de retrofit El tipo de retorno de método no debe include una variable de tipo o comodín en kotlin
  • Usar las extensiones de resources de Kotlin para Android usando solo Maven
  • Obtener una URL en Android Kotlin de forma asíncrona
  • Extensiones en Kotlin
  • Estudio de Android 3: Tiempo de ejecución de Kotlin desactualizado
  • Kotlin RC NoClassDefFoundError
  • Referencia no resuelta: kotlinx
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • Kotlin || ¿No puedo agregar la biblioteca a Mi aplicación?
  • Convierta la actividad principal con la barra de acciones / barra de herramientas y el button de acción flotante a Anko