Estoy implementando una arquitectura MVP en Kotlin y Android Studio no muestra ningún error, sin embargo, no compila:
java.lang.AssertionError: el Descriptor resultante no debe ser nulo: CandidatoDescriptor: constructor BasePresenter (vista: Vista) definido en com.exmaple.base.BasePresenter sustitución: org.jetbrains.kotlin.types.IndexedParametersSubstitution@70144d7e en org.jetbrains.kotlin .resolve.calls.model.ResolvedCallImpl.setResultingSubstitutor(ResolvedCallImpl.java:205) ....
¿Es posible usar ConcreteView / ConcretePresenter en medio de la herencia?
código:
/** * These are the base classes */ interface MvpView interface BaseView<Presenter : BasePresenter<*>> : MvpView, HasMvpView<MvpView> // to avoid circular dependency interface HasMvpView<View : MvpView> abstract class BaseMvpActivity<Presenter : BasePresenter<*>> : AppCompatActivity(), HasMvpView<MvpView> abstract class BaseMvpFragment<Activity : BaseMvpActivity<*>, Presenter : BasePresenter<*>>: Fragment(), HasMvpView<MvpView> { // this will cause the error abstract var presenter: Presenter } /** * There's a Viewpager, and each page looks the same the only difference is their source of data. That's why I tried implementing another level of abstraction over the base classes */ interface CategoryPagerView<Presenter: BasePresenter<*>> : BaseView<Presenter> abstract class CategoryPagerFragment: BaseMvpFragment<LandingActivity, BasePresenter<*>>() /** * A concrete type of the Viewpager's fragment, its presenter and the view */ interface ConcreteView : CategoryPagerView<ConcretePresenter> class ConcretePresenter(view: ConcreteView) : BasePresenter<*>(view) class ConcreteFragment : CategoryPagerFragment(), ConcreteView { // this line shows no error in the IDE, but in compile time override var presenter = ConcretePresenter(this)¡Gracias por tu ayuda!
Es un error de aserción interno lanzado por el compilador. Puede ver el código fuente del compilador donde se lanza esto:
Aparentemente, el resultingDescriptor es null en un punto donde nunca debería ser null . Así que parece un error del compilador. Tal vez debería reescribirse en Kotlin para evitar problemas con null :)
Presente un informe de error en https://youtrack.jetbrains.com/issues/KT