泛型:
* 泛型是java中的类型
* java.lang.Type可以代表java中的所有的类型
* 泛型是被参数化的类型
* 类型 —>Class
* 被参数化–>Class类型可以传递参数
* 泛型的存在的意义
* 多态
实际的类型和需要的类型有可能不匹配
如果不匹配,则会报ClassCastException错误
* 泛型可以在编译的时候告诉Class类型,传递的参数
是什么类型,如果类型错误,则在编译的时候就会
报错
* 泛型所表现的形式
* ArrayList
* ArrayList是Class类型
* ArrayList带一个参数为T,T是一个形参
* 在创建ArrayList对象的时候,就可以决定实参
* 表现:ArrayList a = new ArrayList();
这样实参为Person,这就意味着a集合中只能存放person
* public interface PersonDao{
}
public class BaseDaoImpl<T>{
}
public class PersonDaoImpl extends BaseDaoImpl<Person> implements PersonDao<Person>{
}
* public class Person<? extends Collection>传递的参数只能是集合的子类
* 泛型的用法
public class Person<T>{
}
该参数T可以用在属性和方法(可以用在方法的参数和返回值)上
![这里写图片描述](https://img-blog.csdn.net/20161106205458889)
package cn.itcast.oa0909.dao.base;
import java.io.Serializable;
import java.util.Collection;
public interface BaseDao<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);
}
private Class classt;
/**
* 1、在父类中要执行一段代码,这个代码的执行时间为子类创建对象的时候,这段代码已经执行完了,根据这个需求,有两种方案供选择
* * 利用static语句块
* * 利用父类的构造函数
* 2、分析:
* 因为得到ParameterizedType需要用到this关键字,而this关键字不能出现在static语句块中
* 所以只能选择父类的构造器
*/
public BaseDaoImpl(){
/**
* ParameterizedType就是泛型
*/
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();//getClass当前类.获取泛型父类,就是调它那个类
this.classt = (Class)type.getActualTypeArguments()[0];//<T>//获取实际参数类型,通过数组下标曲拿,因为有可能传递多个
System.out.println(type.getRawType());
}
关于泛型,这段经典代码的解析:
首先把它写在构造函数中,只要某个类去调用这个类,自然就去调用构造方法。构造方法其实也就是在创建子类之前,初始化。
因为static静态代码块是先加载的,所以不能用this,因为对象都还没有创建出来
public interface BaseDao<T>
public class BaseDaoImpl<T> implements BaseDao<T>