android - 如何用泛型类解决二级继承?
问题描述
我正在实现一个 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)
谢谢你的帮助!
解决方案
这是编译器抛出的内部断言错误。您可以看到抛出此问题的编译器源代码:
显然,它永远不应该resultingDescriptor
是。所以它似乎是一个编译器错误。也许应该用 Kotlin 重写它以避免出现问题:)null
null
null
推荐阅读
- javascript - 是否可以在输入字段中显示反应组件?
- c# - C# WPF - 使用 VS2019 安装向导为计算机上的每个用户使用本地数据库 sqlite 部署应用程序
- ios - Xamarin.iOS 中的 OneSignal - 屏幕锁定时没有通知声音
- python - Dask read_parquet 添加了一个额外的列 dir0
- javascript - 如何从外部修改 Angular 生成的 DOM(无需访问源代码)?
- c# - C#如何将条件语句设置为用户输入除外?
- reactjs - 错误“EventSource failed loading: GET”http://localhost:8016/_next/webpack-hmr?page=/”是否导致我在 Next.js 中的 Link 组件出现问题?
- arrays - 如何快速返回tableView numberOfRowsInSection中的不同数组计数
- tensorflow - 将 TensorFlow 从 1.15 降级到 1.14 不起作用
- date - SAS--如何识别连续三年发生的事件?