泛型简介,自定义泛型的应用及泛型在Dao层的应用

首先声明一点什么叫泛型
1.在逻辑上属于不同的类,但是实际上属于同一个类的类型叫做泛型(在Java中学名叫参数化类型)比如

ArrayList<String> a1与 ArrayList<Integer> a2在逻辑上是不同的类型但是实际上是一个类
也就是System.out.println(a1.getClass()==a2.getClass());//输出true

2.它的重要作用是在不同的参数化类型的问题上将运行时异常转换为编译时异常。
这里有一篇不错的文章Java泛型总结大家可以参考参考。

当一个方法接收的是不确定的类型参数的时候我们可用自定义泛型来解决它
比如接下来我们写一个方法能够让任意类型的数组倒序输出

package generic;

import java.util.Arrays;

public class Demo2 <T>{

    public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5};//在泛型中只接受对象类型的变量
        reverse(arr);
        System.out.println(Arrays.asList(arr));//[5, 4, 3, 2, 1]
    }

    //静态方法的泛型要在方法上定义在类上面定义无效
    public static <T> void reverse(T t[]){
        int start = 0;
        int end = t.length-1;
        while(true){
            if(start>end){
                break;
            }
            T temp = t[0];
            temp = t[start];
            t[start] = t[end];
            t[end] = temp;
            start++;
            end--;
        }
    }
}

看完这个案例之后我们再谈谈泛型在Dao层的框架(herbinate)中的重要应用,在JDBC中我们用Dao层作为我们的数据与数据库交互的一层。但是有一件事很让人头疼,我们必须根据不同的操作对象去写不同的Dao层。但是在herbinate的情况下我们只需要用自定义参数类型(自定义泛型)写一个基础的Dao然后让其他的Dao继承基础Dao就能轻松实现不同操作对象的增删改查。下面请看代码

首先建一个Person类它将作为我们的操作类

package generic;

public class Person {

}

然后写好我们的Person操作类即PersonDao 并让他继承我们的BaseDao

package generic;

import domain.Person;

public class PersonDao extends BaseDao<Person>{

}

接下来是重点创建BaseDao类(前提是在操作环境中导入herbinate的相关包)那么它是如何得到PersonDao类的操作类的呢?

首先由于 PersonDao在new一个新的对象的时候会调用父类BaseDao的构造器那么我们就会通过构造器拿到PersonDao这个类。Class clazz = this.getClass();

然后通过这个子类去拿他所继承的带参数的父类即BaseDao<Person>

最后通过getActualTypeArguments()[0]方法得到我们想要操作的类型Person,在这里也就是参数化类型的第一个参数


package generic;

import java.lang.reflect.ParameterizedType;

import org.hibernate.Session;

public class BaseDao <T> {
    private Session session;
    private Class clazz;

    public BaseDao(){
        Class clazz = this.getClass();//如果子类调用父类的这个构造器的话那么clazz将得到BaseDao的子类
        ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass();//得到带参数的父类(学名叫参数化类型)在这里就是BaseDao<Person>,
        clazz = (Class) pt.getActualTypeArguments()[0];//得到上述类型中第一个参数在这里我们就得到了Person类
    }

    public void add(T t){
        session.save(t);
    }

    public void delete(String id){
        T t = (T) session.get(clazz, id);
        session.delete(t);
    }

    public void update(T t){
        session.update(t);
    }

    public T find(String id){
        return (T) session.get(clazz, id);
    }
}

最后附上测试代码

package generic;

public class Test {
    public static void main(String[] args) {
        PersonDao pdao = new PersonDao();
        pdao.add(new Person());//此时PersonDao已经有了BaseDao的所有方法
    }
}

如有错误恳请大家指出
最后再次感谢方立勋老师!
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elong_Hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值