您的位置:首页 > 编程语言 > Java开发

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

2017-08-06 21:48 288 查看
首先声明一点什么叫泛型

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的所有方法
}
}


如有错误恳请大家指出

最后再次感谢方立勋老师!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息