Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)

IDE(编辑器)报错

循环引用泛型是我起的名字,不知道官方的名字是什么。这个问题是我在定义Android 的MVP时提出来的。具体是什么样的呢?我们看一下我的基础的MVP定义:

interface IPresenter<V> {
   
     
	fun getView(): V  
}

interface IView<P> {
   
     
	fun getPresenter(): P  
}

这里我定义了一个View和Presenter的接口,但是实际上这两个东西现在没什么关联。

这时,我想提供一个Presenter与View的基类,在基类中实现某些通用功能,并且增加这样的约束:Presenter中拿到的V必须是View的子类,View中拿到的P必须是Presenter的子类,那我们知道,可以通过kotlin,指定上界的方式。

我们修改上边的代码:改成下边这样:

interface IPresenter<V: IView> {
   
     
	fun getView(): V  
}

interface IView<P: IPresenter> {
   
     
	fun getPresenter(): P  
}

同时我们也很容易发现,编译器报错了:

Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)_第1张图片

IDE提示这个错误:One type argument expected for interface IPresenter,意思是:IPresenter必须指定一个泛型类型才可以。在Kotlin中,这样的写法是直接保存的,在Java中,这种写法只是警告,所以Java中使用这种写法,“没问题”(没有IDE报错问题)。

Java 中如何实现这个定义

我们来看一下Java

interface IPresenter<V extends IView> {
   
     
	V getView();  
}  
  
interface IView<P extends IPresenter> {
   
     
	P getPresenter();  
}

接着我们看IDE的提示:

Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)_第2张图片

出现了警告,但是不报错了,我们看一下提示是什么:
Raw use of parameterized class 'IPresenter' 意思是其实和Kotlin提示的差不多,希望你指定一个泛型类型,而不是直接使用这个类。

在Java中,为了解决这个提示,可以使用?

interface IPresenter<V extends IView<?>> {
   
     
	V getView();  
}  
  
interface IView<P extends IPresenter<?>> {
   
     
	P getPresenter(

你可能感兴趣的:(Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类))