首页 > 解决方案 > 如何用泛型类解决二级继承?

问题描述

我正在实现一个 MVP 架构Kotlin,Android Studio 没有显示错误,但是它没有编译:

java.lang.AssertionError:结果描述符不应为空:candidateDescriptor:com.exmaple.base.BasePresenter 替换中定义的构造函数 BasePresenter(视图:视图):org.jetbrains.kotlin.types.IndexedParametersSubstitution@70144d7e 在 org.jetbrains.kotlin .resolve.calls.model.ResolvedCallImpl.setResultingSubstitutor(ResolvedCallImpl.java:205) ....

是否可以在继承中间使用ConcreteView/ ?ConcretePresenter

代码:

/**
 * 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)

谢谢你的帮助!

标签: androidgenericsinheritancekotlinpolymorphism

解决方案


这是编译器抛出的内部断言错误。您可以看到抛出此问题的编译器源代码:

https://github.com/JetBrains/kotlin/blob/master/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/model/ResolvedCallImpl.java

显然,它永远不应该resultingDescriptor是。所以它似乎是一个编译器错误。也许应该用 Kotlin 重写它以避免出现问题:)nullnullnull

请在https://youtrack.jetbrains.com/issues/KT提交错误报告


推荐阅读