2019独角兽企业重金招聘Python工程师标准>>>

泛型的定义主要有以下两种:

  1. 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)

  2. 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

泛型只不过是java中的类型而已,继承自Type接口。

泛型的意义在于:在抽象的时候泛化,在具体的时候细化,在编译的时候就可以决定泛化的值。通俗得讲,可以将泛型看做是类或者接口带了一个参数,这个参数可以在属性、方法的参数、方法的返回值中使用使用。

ParameterizedType有如下几个方法:

 Type[] getActualTypeArguments() 
          返回表示此类型实际类型参数的 Type 对象的数组。
 Type getOwnerType() 
          返回 Type 对象,表示此类型是其成员之一的类型。
 Type getRawType() 
          返回 Type 对象,表示声明此类型的类或接口。

actualTypeArguments指类的参数

rawType指带了参数的类或者接口

了解这些之后,就可以对使用了Hibernate的Dao进行一次CRUD的重构。

import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import javax.annotation.Resource;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
/**
  * 超类dao实现,专门用于继承
  */
@SuppressWarnings ( "unchecked" )
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
     //注入会话工厂
     @Resource (name= "sessionFactory" )
     private SessionFactory sf ;
     
     private Class<T> clazz ;
         /**
      * 1、this代表该类的子类
      * 2、this.getClass().getGenericSuperclass()代表该类
      * 3、type.getActualTypeArguments()[0]就是T
      * 4、type.getRawType()就是BaseDaoImpl
      */
         public BaseDaoImpl(){
         ParameterizedType type = (ParameterizedType) this .getClass().getGenericSuperclass();
         clazz = (Class<T>) type.getActualTypeArguments()[ 0 ];
     }
     public void saveEntity(T t) {
         sf.getCurrentSession().save(t);
     }
     public void updateEntity(T t) {
         sf.getCurrentSession().update(t);
     }
     public void saveOrUpdateEntity(T t) {
         sf.getCurrentSession().saveOrUpdate(t);
     }
     public void deleteEntity(T t) {
         sf.getCurrentSession().delete(t);
     }
     //批量更新
     public void batchEntityByHQL(String hql, Object... objects) {
         Query q = sf.getCurrentSession().createQuery(hql);
         for ( int i = 0 ; i < objects.length ; i ++){
             q.setParameter(i, objects[i]);
         }
         q.executeUpdate();
     }
     public T getEntity(Integer id) {
         return (T) sf.getCurrentSession().get(clazz, id);
     }
     public T loadEntity(Integer id) {
         return (T) sf.getCurrentSession().load(clazz, id);
     }
     public Collection<T> findEntityByHQL(String hql, Object... objects) {
         Query q = sf.getCurrentSession().createQuery(hql);
         for ( int i = 0 ; i < objects.length ; i ++){
             q.setParameter(i, objects[i]);
         }
         return q.list();
     }
}

转载于:https://my.oschina.net/tinglanrmb32/blog/370444

对Java泛型的简单理解相关推荐

  1. Java泛型的个人理解

    2019独角兽企业重金招聘Python工程师标准>>> java泛型的意义 首选,我们说一下,为什么要用泛型,泛型来解决什么问题. 泛型解决, 某一个集合类内部添加多个类的某一种类的 ...

  2. JAVA反序列化漏洞简单理解

    反序列化原理 关于反序列化的原理不在多说,和php类似,序列化的数据是方便存储的,而存储的状态信息想要再次调用就需要反序列化 Java反序列化的API实现 实现方法 Java.io.ObjectOut ...

  3. Java包的简单理解

    包的理解 那java项目中也是可以分不同文件夹的.只不过java中类的文件夹不叫文件夹,叫"包名" 英文单词:package,那package还有个意思就是打包的意思,所以你可以理 ...

  4. Java虚拟机JVM简单理解

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  5. 【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    文章目录 一.泛型简介 二.泛型类 三.泛型方法 四.静态方法的泛型 五.泛型类与泛型方法完整示例 一.泛型简介 泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ; j ...

  6. java泛型程序设计——定义简单泛型类+泛型方法

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识: [1]一个泛型类: 就是具有一个或多个 ...

  7. java泛型特点_java泛型简单总结

    Java泛型简单总结 1)基本概念: 泛型(Generic Type或Generics)是 对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看做是使用参数化类型时 ...

  8. 深入理解Java泛型

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

  9. java相关求助---Java泛型的理解与等价实现---------没有完全明白啊...请大神指导...

    1.泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的        创建中,分别称为泛型类.泛型接口.泛型方法. ...

最新文章

  1. 微信小程序多项选择器_微信小程序三级联动之多列选择器
  2. git新建项目并push进去
  3. 百万数据报表导出:需求以及思路分析
  4. Magento调用静态块 static block
  5. CCF认证-2014-12-2 Z字形扫描
  6. linux 多路径配置
  7. 图书管理系统软件测试报告_软件测试新手入门小知识点,一定要牢记
  8. 微信小程序:收款码三合一制作微信小程序源码下载多模板选择
  9. 中继器系列:中继器增删改查
  10. 个人公众号,用于开发经验分享
  11. 刷 LeetCode 吃力正常吗?
  12. php期末大作业可以做什么,期末要交一个基于php连入数据的大作业
  13. 脉冲星 6 月脉动 | Pulsar Summit 北美峰会圆满结束,ApacheCon 议程官宣
  14. RAID 1 的优点缺点和应用场景
  15. 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
  16. mysql复制多行_mysql中的复制方式总结(半同步复制,并行复制,多源复制)
  17. 下载 电子商城类型htm模板_淘抢购蓝紫色活动背景促销关联价格曲线_psd素材免费下载_ 790*2468像素(编号:24640080)...
  18. 阿里云 SUSE linux 安装谷歌浏览器Chrome 安装goole浏览器报错
  19. html不鼓励使用的标签,鼓励和提醒孩子使用敬语.html
  20. mysql 三种注释_mysql的注释有几种写法?

热门文章

  1. 从源码来理解slf4j的绑定,以及logback对配置文件的加载
  2. 2.Linux技能要求
  3. Kibana安装及简单使用
  4. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...
  5. 《转》IIS中配置通配符应用程序映射
  6. VMWare下的DOS与宿主机的文件共享
  7. 初创公司根本没数据,增长黑客个屁
  8. 优化网站性能 提高网站速度访问速度的14条实践
  9. 怎么使用继承的一个实例
  10. 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据