泛型属于Java的类型,是被参数化的类型,具有一个或多个类型变量的类。
- 类型 Class
- 被参数化 Class类型可以传递参数
泛型存在的意义: - 多态情景下出现的类型不匹配,报出来的ClassCastException异常
- 编译的时候即可得知Class类型,从而传递对应的类型。如果类型出现错误,编译的时候就会报错。
泛型类:创建实例时需要为其类型变量赋值,否则会有警告(类名之后)
class A{
}
A a = new A();
泛型方法:(返回值之前)
public T fun(T t){
}
注意泛型类中的方法和泛型方法的区别:
public A{
public T fun(T t){} //该方法属于泛型类中的一个方法,泛型方法返回值前面必须有<>
}
泛型方法和泛型类没有什么关系,泛型方法不一定非要在泛型类中。
泛型在类中或方法中的使用
class A{
private T bean; //泛型在成员变量上使用
public T fun(T t){} //泛型可以在类中的方法上使用(返回值和参数类型)
public void fun2(){
T b = …; //局部变量引用类型上使用
new T();//不可以被使用
}
}
java.lang.Type是所有类型的基类(注意区别于Object是所有对象的基类)。
泛型的继承和实现:
- 子类不是泛型类,需要给父类传递类型常量。
- 子类是泛型类,可以给父类传递类型常量,也可以传递类型变量
class A<T>{ //类名后带有<>所以该类为泛型类
private T t; //泛型在成员变量上使用
public T fun1(){ //泛型在类中的方法上使用,返回值
return t;
}
public void fun2(T t){ //泛型在类中的方法参数上使用
this.t = t;
}
}
class AA1 extends A<Integer>{ //子类不是泛型类
//父类确定一个类型常量Integer
}
class AA2<E> extends A<E>{ //子类是泛型类
//父类既可以为一个常量,也可以为类型变量
//在创建对象是确定具体的类型
}
表现形式:通常为方法的形参,使方法更加通用
无界限定:? 参数和返回值为泛型的方法,不能使用
子类限定:? extends Object 参数为泛型的方法不能使用
父类限定:? super Integer 返回值为泛型的方法不能使用
- ArrayList ArrayList是Class类型,但一个参数为T的形参。在创建对象传实参的时候决定T的实际类型。new ArrayList()
- 在一些项目中作为功能代码的复用重构
/**
该接口可以固定为对数据实体的增删改查
其他具体的类可通过实现该接口而具体对某个实体对象进 行增删改查
*/
public interface BaseDao<T>{
//参数T可以用在属性和方法上(参数和返回值)
public Collection<T> getAllEntry();
public T getEntryById(Serializable id);
public void saveEntry(T t);
public void updateEntry(T t);
public void deleteEntry(Serializable id);
}
/**
泛型类不可被实例化,但还需要在spring容器中配置
<bean .... **abstract="true"**>
父类不想被实例化,子类还想用它的属性,parent属性配置
*/
public class BaseDaoImpl<T> implements BaseDao<T>{
@Resource(name="hibernate")
public HibernateTemplate hibernateTemplate;
/**
获取泛型
子类不想调用任何方法就可执行该方法:即父类中的代码在子类创建对象的时候就已经执行完了
1.用static语句块(但this不能出现在该语句块中)
2.利用父类的构造函数
*/
private Class classt;
public void BaseDaoImpl(){
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
this.classt = (Class)type.getActualTypeAtruments()[0];//获取泛型的类型
}
public Collection<T> getAllEntry(){
return this.hibernateTemplate.find("from"+this.classt.getName());
}
public T getEntryById(Serializable id){
//如何确定第一个参数的class,即如何得到泛型?
return (T)this.hibernateTemplate.get(this.classt,id)
}
public void saveEntry(T t){
this.hibernateTemplate.save(t);
}
public void updateEntry(T t){
this.hibernateTemplate.update(t);
}
public void deleteEntry(Serializable id){
T t = this.getEntryById(id);
this.hibernateTemplate.delete(t);
}
}
/**
后续的不同实体dao直接继承BaseDaoImpl
*/
public class DepartDao extends BaseDaoImpl……