Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何解决泛型类的二级继承?_Android_Generics_Inheritance_Kotlin_Polymorphism - Fatal编程技术网

Android 如何解决泛型类的二级继承?

Android 如何解决泛型类的二级继承?,android,generics,inheritance,kotlin,polymorphism,Android,Generics,Inheritance,Kotlin,Polymorphism,我在Kotlin中实现了一个MVP架构,Android Studio没有显示任何错误,但是它没有编译: java.lang.AssertionError:resultingDescriptor不应为空: 候选描述人:构造函数BasePresenter(视图: 视图)在com.exmaple.base.BasePresenter替换中定义: org.jetbrains.kotlin.types。IndexedParametersSubstitution@70144d7e在 org.jetbrain

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

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

是否可以在继承中使用<代码>混凝土视图<代码> />代码>混凝土演示者< /代码>?p> 代码:

/**
*这些是基类
*/
接口MvpView
接口BaseView:MvpView,HasMvpView
//避免循环依赖
接口HasMvpView
抽象类BaseMvpActivity:AppCompatActivity(),HasMvpView
抽象类BaseMvpFragment:Fragment(),HasMvpView{
//这将导致错误
抽象变量演讲者:演讲者
}
/**
*有一个Viewpager,每个页面看起来都一样,唯一的区别是它们的数据源。这就是为什么我尝试在基类上实现另一个抽象级别
*/
接口CategoryPagerView:BaseView
抽象类CategoryPagerFragment:BaseMvpFragment()
/**
*Viewpager片段、其演示者和视图的具体类型
*/
接口视图:CategoryPagerView
类ConcretePresenter(视图:ConcreteView):BasePresenter(视图)
类ConcreteFragment:CategoryPagerFragment(),ConcreteView{
//这一行在IDE中没有显示错误,但在编译时显示错误
覆盖变量presenter=ConcretePresenter(此)

感谢您的帮助!

这是编译器引发的内部断言错误。您可以看到引发此错误的编译器源代码:

显然,
resultingDescriptor
null
值不应该是
null
。因此它似乎是一个编译器错误。也许应该在Kotlin中重写它,以避免出现
null
:)


请在

上提交错误报告。您可以共享
BasePresenter
类吗?(或其最低版本)?与
LandingActivity
相同。所有类都是必需的。当然!我怀疑编译器错误是由使用
*
作为类型参数触发的。无论如何,您可能希望避免这种情况。我想您希望
BaseView
Presenter
参数绑定到
BaseView
本身的具体类型,对吗你可以像在中那样做,这也恰好是关于视图和演示者的。
/**
 * 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)