一、Kot对泛型能有很好的支持,下面的例子,是基于泛型搭建的一个Mvp,感兴趣的话,可以自己debug调试一下。
import com.sun.xml.internal.rngom.parse.host.Base
import java.lang.reflect.ParameterizedType
/**
* @author:wangdong
* @description:泛型实现一个mvp的框架
*/
/**
* 视图接口
* 协变out
*/
interface Iview<out P: IPresenter<Iview<P>>>{
val presenter: P
}
/**
* 主持人
*/
interface IPresenter<out V: Iview<IPresenter<V>>>{
val view: V
}
/**
* 定义两个实现类,各自实现两个接口
*/
abstract class BaseView<out P: BasePresenter<BaseView<P>>>:Iview<P>{
override val presenter: P
//初始化presenter
init {
presenter = findPresenterClass().newInstance()
presenter.view = this
}
private fun findPresenterClass():Class<P>{
var thisClass: Class<*> = this.javaClass
while (true){
(thisClass.genericSuperclass as? ParameterizedType)?.actualTypeArguments?.firstOrNull()
?.let {
return it as Class<P>
}
?: run{
thisClass = thisClass.superclass ?: throw IllegalArgumentException()
}
}
}
}
abstract class BasePresenter<out V: Iview<BasePresenter<V>>>:IPresenter<V>{
override lateinit var view: @UnsafeVariance V
}
class MainView: BaseView<MainPresenter>()
class MainPresenter: BasePresenter<MainView>()
fun main(args: Array<String>) {
MainView().presenter.let(::println)
}
最后的输出结果
MainPresenter@7a81197d
好啦,结束啦