java 泛型 basedao_Java泛型复习

本文详细介绍了Java泛型的概念,包括设计原则、作用及泛型类和泛型方法的使用。通过实例展示了泛型如何简化代码,提高程序的健壮性和可读性,避免运行时类型转换异常。此外,还探讨了泛型在抽象类和接口中的应用,并展示了如何通过泛型实现通用DAO模板,减少重复代码。
摘要由CSDN通过智能技术生成

一、什么是泛型?

Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.

泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

参数化类型:

ArrayList中的E称为类型参数变量

ArrayList中的Integer称为实际类型参数

整个称为ArrayList泛型类型

整个ArrayList称为参数化的类型ParameterizedType

二、为什么需要泛型

有了泛型以后:

代码更加简洁【不用强制转换】

程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】

可读性和稳定性【在编写集合的时候,就限定了类型】

在创建集合的时候,我们明确了集合的类型了,所以我们可以使用增强for来遍历集合!

//创建集合对象

ArrayList list = new ArrayList<>();

list.add("hello");

list.add("world");

list.add("java");

//遍历,由于明确了类型.我们可以增强for

for (String s : list) {

System.out.println(s);

}

三、泛型基础

泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来….这样的话,用户明确了什么类型,该类就代表着什么类型…用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。

在类上定义的泛型,在类的方法中也可以使用!

/*

1:把泛型定义在类上

2:类型变量定义在类上,方法中也可以使用

*/

public class ObjectTool {

private T obj;

public T getObj() {

return obj;

}

public void setObj(T obj) {

this.obj = obj;

}

}

用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。

public static void main(String[] args) {

//创建对象并指定元素类型

ObjectTool tool = new ObjectTool<>();

tool.setObj(new String("钟福成"));

String s = tool.getObj();

System.out.println(s);

//创建对象并指定元素类型

ObjectTool objectTool = new ObjectTool<>();

/**

* 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.

*/

objectTool.setObj(10);

int i = objectTool.getObj();

System.out.println(i);

}

定义泛型方法….泛型是先定义后使用的

//定义泛型方法..

public void show(T t) {

System.out.println(t);

}

用户传递进来的是什么类型,返回值就是什么类型了

public static void main(String[] args) {

//创建对象

ObjectTool tool = new ObjectTool();

//调用方法,传入的参数是什么类型,返回值就是什么类型

tool.show("hello");

tool.show(12);

tool.show(12.5);

}

子类明确泛型类的类型参数变量

/*

把泛型定义在接口上

*/

public interface Inter {

public abstract void show(T t);

}

实现泛型接口的类…..

/**

* 子类明确泛型类的类型参数变量:

*/

public class InterImpl implements Inter {

@Override

public void show(String s) {

System.out.println(s);

}

}

四、泛型的应用

当我们写网页的时候,常常会有多个DAO,我们要写每次都要写好几个DAO,这样会有点麻烦。

public abstract class BaseDao {

//模拟hibernate....

private Session session;

private Class clazz;

//哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要)

public BaseDao(){

Class clazz = this.getClass(); //拿到的是子类

ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); //BaseDao

clazz = (Class) pt.getActualTypeArguments()[0];

System.out.println(clazz);

}

public void add(T t){

session.save(t);

}

public T find(String id){

return (T) session.get(clazz, id);

}

public void update(T t){

session.update(t);

}

public void delete(String id){

T t = (T) session.get(clazz, id);

session.delete(t);

}

}

继承抽象DAO,该实现类就有对应的增删改查的方法了。

public class CategoryDao extends BaseDao {

}

BookDao

public class BookDao extends BaseDao {

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值