前面泛型类我们详细的讲解了什么是泛型类以及泛型类的使用。但是大家都知道,Java中除了类还有接口。那么泛型也不例外,泛型同样有接口,那么泛型接口是什么呢、泛型接口如何定义呢以及泛型接口有什么作用呢?我们再次带着这些问题来讲解泛型的第二篇章:泛型接口
一、泛型接口如何定义
泛型接口的定义和泛型类的定义一样,区别就在于一个是接口需要实现各个接口方法,一个是类,需要实现对应的抽象方法。
/**
* 创建时间:2019/5/3
* 创建人:czf
* 功能描述:这是一个单泛型参数的泛型接口,泛型接口和泛型类一样都是可以有多个泛型参数的。具体的参数类型在具体使用时绑定
* 定义一个泛型接口语法如下:
* 接口名<泛型参数、泛型参数...>{
*
* }
**/
public interface AdapterItemListener<T> {
void onItemClick(int position,T item);
void onLongItemClick(int position, T item);
}
二、什么是泛型接口
泛型接口就是接口函数与数据类型间接解绑的接口。什么意思呢,这里我们通过在开发中具体的例子来讲解。我们在日常开发中最常见的就是RecyclerView列表的展示,但是RecyclerView自身又没有像ListView那样为我们提供设置item点击的监听。这个时候就需要我们自己来实现item点击的监听。但是每个列表的数据结构都不同,难道每有一个列表我们就要创建一个对应的Listener接口吗?答案肯定是否定了,这里的解决方案就是我们只需要创建一个泛型接口,那么到底如何实现呢?撸代码告诉你:
/**
* 这里我们在使用时通过定义来进行泛型参数与具体数据类型的绑定,然后我们只需要在Adapter中添加设置监听的方法即可,完美实现一个接口能够对不同数据结构的列表的监听
*/
AdapterItemListener<TopBean> itemListener = new AdapterItemListener<TopBean>() {
@Override
public void onItemClick(int position, TopBean item) {
}
@Override
public void onLongItemClick(int position, TopBean item) {
}
};
RecyclerAdapter recyclerAdapter = new RecyclerAdapter();//这是我们用来展示数据列表的Adapter适配器
recyclerAdapter.setTopBeanItemListener(itemListener);//setTopBeanItemListener方法的参数是AdapterItemListener<TopBean>
/**
*实现接口,并于String数据类型绑定
*/
AdapterItemListener<String> itemListener2 = new AdapterItemListener<String>() {
@Override
public void onItemClick(int position, String item) {
}
@Override
public void onLongItemClick(int position, String item) {
}
};
//这里的itemListener2的类型是AdapterItemListener<String>,而Adapter的设置方法setTopBeanItemListener参数类型是AdapterItemListener<TopBean>,俩者不一致所以直接编译错误。
recyclerAdapter.setTopBeanItemListener(itemListener2);
/**
*实现接口,并于BaseClass数据类型绑定
*/
AdapterItemListener<BaseClass> itemListener3 = new AdapterItemListener<BaseClass>() {
@Override
public void onItemClick(int position, BaseClass item) {
}
@Override
public void onLongItemClick(int position, BaseClass item) {
}
};
recyclerAdapter.setBaseClassItemListener(itemListener3);
recyclerAdapter.setBaseClassItemListener(itemListener);//itemListener的类型是AdapterItemListener<TopBean>,这里类型不匹配所以编译错误
前面我们在讲泛型类的时候有说到泛型类的泛型参数的继承关系不会延续到泛型类中来,泛型接口同样有这个限制。 如上代码所示第二个setBaseClassItemListener方法直接编译错误,虽然TopBean是BaseClass的子类,但是接口 AdapterItemListener<TopBean>和接口AdapterItemListener<BaseClass>没有半点关系。
三、泛型接口的作用
这里我们只是通过一个最常见的列表单击监听来讲解泛型接口,但是在实际开发中,泛型接口是使用最多的一种。尤其在设计模式、架构设计等方面泛型接口是无可替代的方案。如今最流行的MVP应用架构设计、OkHttp网络框架、RxJava+Retifter+okHttp框架、代理模式等都有泛型接口的身影。在下一篇的MVP模式实战中我们将会看到泛型在架构设计中独一无二的魅力和作用。