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

  • El tipo Out-Projected 'ArrayList <*>' prohíbe el uso de 'public fun fun add (índice: Int, elemento: E): Unidad definida en java.util.ArrayList'
  • Clases de Kotlin sin llaves
  • Este tipo tiene un constructor y debe ser inicializado aquí - Kotlin
  • Función de extensión de llamada dentro de la class Java como cualquier operador de RX
  • La function Kotlin requiere nada, pero se define como un tipo diferente
  • No se pueden agregar las extensiones de Kotlin para Android a mi proyecto
  • Botones de acceso del layout inflados programáticamente dentro de otro layout
  • Los methods de logging de Anko no se pueden resolver
  • Cómo usar AndroidAnnotación @ShanetworkingPref con Kotlin
  • Parsing xml kotlin android
  • La class Kotlin Custom View implementa una interfaz que no se puede resolver en `: app: compileDebugKotlinAfterJava`. La versión idéntica de Java funciona bien