1.什么是泛型?
在jdk1.5之后出现的,在编译时自动检测类型,减少类型的转换.
2.怎样使用泛型?
可以在方法,类,接口中使用泛型.
泛型方法:public <T> void mothod(T t){}
泛型类:public class Demo<T>{}
泛型接口:public interface Demo<T>{}
3.泛型的擦除
编译过后的Class字节码文件中不存在泛型.
4.在哪里使用泛型?
用于公共的方法中,不确定类型中.
5.泛型关键字:
?:可以接收任何泛型,但不能编辑值,所以一般在方法参数中用.
如:
方法:public void save(List<?> list){}
调用方法:public void test(){
List<String> list = new ArrayList<String>();
save(list);//使用正确
List<?> list = new ArrayList<String>();
list.add();//不能编辑
}
extends :如:
public void save(List<? extends Number> ); //意思就是?中的类型必须是Number的子类
super: 如:
public void save (List<? super String >); //意思就是 ?中的类型必须是String的父类或本身
6.反射泛型
如:怎样获取当前运行类参数化类型的实际类型
例如:
public class AdminDao extends BaseDao<Admin>{
}
//操作数据库的公共方法
public class BaseDao<T>{
private Class clazz;//保存当前运行类参数化类型中的实际类型
//获取表名
private String tableName;
public BaseDao(){
//this 表示当期运行类
//this.getClass() 当前运行类的字节码(AdminDao.class)
//this.getClass().getGenericSuperclass(); 当前运行类的父类,及(BaseDao<Admin>)
其实就是"参数化类型" ParamerizedType
Type type = this.getClass().getGenericSuperclass();
ParamerizedType pt = (ParamerizedType) type;
//获取参数化中实际的定义类型
Type types[] =pt.getActualTypeArguments();
获取数据的第一个元素
clazz = (Class)types[0];
tableName =clazz.getSimpleName();
}
public T findById(int id){
String sql="select * from '"+tableName+"'where id = ?"
........
}
}