泛型简介,自定义泛型的应用及泛型在Dao层的应用
2017-08-06 21:48
288 查看
首先声明一点什么叫泛型
1.在逻辑上属于不同的类,但是实际上属于同一个类的类型叫做泛型(在Java中学名叫参数化类型)比如
2.它的重要作用是在不同的参数化类型的问题上将运行时异常转换为编译时异常。
这里有一篇不错的文章Java泛型总结大家可以参考参考。
当一个方法接收的是不确定的类型参数的时候我们可用自定义泛型来解决它
比如接下来我们写一个方法能够让任意类型的数组倒序输出
看完这个案例之后我们再谈谈泛型在Dao层的框架(herbinate)中的重要应用,在JDBC中我们用Dao层作为我们的数据与数据库交互的一层。但是有一件事很让人头疼,我们必须根据不同的操作对象去写不同的Dao层。但是在herbinate的情况下我们只需要用自定义参数类型(自定义泛型)写一个基础的Dao然后让其他的Dao继承基础Dao就能轻松实现不同操作对象的增删改查。下面请看代码
首先建一个Person类它将作为我们的操作类
然后写好我们的Person操作类即PersonDao 并让他继承我们的BaseDao
接下来是重点创建BaseDao类(前提是在操作环境中导入herbinate的相关包)那么它是如何得到PersonDao类的操作类的呢?
首先由于 PersonDao在new一个新的对象的时候会调用父类BaseDao的构造器那么我们就会通过构造器拿到PersonDao这个类。Class clazz = this.getClass();
然后通过这个子类去拿他所继承的带参数的父类即
最后通过getActualTypeArguments()[0]方法得到我们想要操作的类型Person,在这里也就是参数化类型的第一个参数
最后附上测试代码
如有错误恳请大家指出
最后再次感谢方立勋老师!
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的所有方法 } }
如有错误恳请大家指出
最后再次感谢方立勋老师!
相关文章推荐
- 自定义泛型方法及其应用
- 自定义泛型方法及其应用和类型参数的类型推断
- 电商项目笔记之二:自定义带泛型的DaoSupport<T>类
- 自定义泛型方法及其应用
- 黑马程序员------Java的泛型(原理应用、自定义泛型)
- SSH项目开发自定义带泛型DaoSupport<T>类以及用户管理UserinfDao类
- 基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之三:hibernate4泛型dao的应用
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- Spring JdbcTemplate实现通用的泛型dao四:通用自定义转换到JavaBean的RowMapper实现
- 40_自定义泛型方法及其应用
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- java基础加强--自定义泛型方法及其应用
- 泛型于Dao中的应用案例一
- Spring JdbcTemplate实现通用的泛型dao四:通用自定义转换到JavaBean的RowMapper实现
- 自定义ClassLoader实现java应用核心逻辑模块热部署
- Xcode自定义字体不能应用的原因
- Java自定义Annotation的应用(注解@)
- Android 应用内自定义随机布局输入法
- android 中dialog的应用 --- 自定义的dialog
- Android自定义字体类库Calligraphy--快速实现自定义应用字体