为什么使用接口泛型?初步接触接口发现在非常多接口定义中是否泛型来传递参数。试问为什么接口定义中要是使用泛型,主要避免空指针和强类型转换,下面来细说。
一、接口泛型
1. 定义
定义格式: <引用数据类型>,在API中是<E> 注意:尖括号中的数据类型只能是引用数据类型,<E>在创建对象的时候添加在类后面ArrayList<String> list = new ArrayList<String>();
接口泛型定义格式如下,其中T通过泛化参数类型 泛型接口: Interface IA<T extends BaseBean> {public T doSomething();}
接口实现类,指定实际类型 class IAImpl implements IA<ChildBean>{ public ChildBean doSomething(){ return new ChildBean(); } }
2. 强制类型转换
对象类型转换,是指存在继承关系的对象,而是任意类型对象。如果父类引用对象是子类对象,那么在向下转型的过程中是安全的;如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会抛出Java强制类型转换(java.lang.ClassCastException)异常,我们一般使用instanceof运算符来避免出此类错误。(instanceof运算符用于判断该运算符前面引用类型变量指向的对象是否是后面类或者是其子类、接口实现类创建的对象,如果是则返回true,否则返回false)
二、扩展及使用场景
1. 泛型
泛型就是一种未知的类,将未知的类型声明在集合、对象上,泛型的默认类型为Object。把明确数据类型的工作,提前到了编译时期。这样的做法有点像把数据类型当作参数一样进行传递。所以泛型还有一个名字叫做:参数化类型;
2. 泛型类
泛型类:把泛型定义在类上(在类名后面添加<变量名>) 格式:public class 类名<泛型类型1,…> 注意:泛型类型必须是引用类型
class GenericTool1<T> { private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
3. 泛型方法
泛型方法:把泛型定义在方法上 格式:public <泛型类型> 返回类型 方法名(泛型类型 .) 例: public<T> void show(T t){}
public class GenericTool2 { //定义泛型成员方法 public<T> void show(T t){ System.out.println(t); } }
4. 泛型接口
泛型接口:把泛型定义在接口上格式:public interface 接口名<泛型类型1...>
//定义泛型接口,接口中的方法参数和接口一致 public interface GenericTool3<T> { public abstract void show(T t); }