Java泛型项目中的应用

泛型属于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……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值