Kotlin泛型:实现MVP的接口

在下面的例子中,我明白BaseActivity不能作为presenter.onAttached的参数presenter.onAttached ,尽管它实现了与V类似的BaseView接口。实现的Presenter可能被提供了BaseView的一个子类,例如MainPresenter<MainView> ,这意味着BaseView不够具体。

 abstract class BaseActivity<V : BaseView, out P : BasePresenter<V>> : AppCompatActivity(), BaseView { abstract val presenter : P override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(this) // Type mismatch } } 

但是,我仍然需要通过参考实施活动来告诉演讲者其观点是什么。 理想情况下,我可以从Base类中完成所有这些工作,这样MVP实现细节对于实现类几乎是不可见的。

我已经找到了两种方法来做到这一点,但他们有他们的问题:

1.我可以让每个执行活动都覆盖一个V字段,但是每一个执行活动都会有相同的代码行! 锅炉多? 它似乎也不符合泛型的精神。

 // base abstract val view : V override fun onCreate(savedInstanceState: Bundle?) { ... presenter.onAttached(view) } // impl override val view = this 

我可以假设this总是一个V并忽略lint错误。 然而这是危险的,并且不符合泛型的精神。

 presenter.onAttached(this as V) 

Kotlin有没有一种性感的方式呢? 某种约束,所有扩展BaseActivity的类都必须实现某种BaseView?