Java泛型<Type>在实际开发中的一点运用总结(随笔)

泛型的概念:

           泛型是java中的一种类型,在java中所有的类型都可以用Type来代替;泛型是JDK 1.5以后的的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。在Java编程思想中解释道:泛型的主要目的之一就是指定容器要持有什么类型的对象,而且由我们的编译器来保证类型的正确性。

          关于泛型类(Generic Type)的语法定义其实也非常的简单,主要是在类名之后加上一个“<>”,然后在这个“<>”里面加上一个类型参数。

public class GenericTypeDemo<T> {
    // 定义该泛型
     private T value;
 
     public T getValue() {
         return value;
     }
 
     public void setValue(T value) {
         this.value = value;
     }
}

注意:泛型所带的类型参数不仅仅局限于一个,而是可以携带多个类型参数的,比如:

public class GenericTypeDemo<T,U,...>{
    ......
}

Parameterized   Type  该类型就是泛型

public interface ParameterizedType extends Type {   
	//得到实际类型的参数
	Type[] getActualTypeArguments();
	//得到rawType
	Type getRawType();
	//得到自己的类型
	Type getOwnerType();
}

理解ActualTypeArguments、RawType

public class PersonService<E>{
	        
} 

        上述的class由两部分组成
           PersonService------->  rawType
           <E>  --------------------> 代表形参
           getActualTypeArguments() 该方法告诉我们<E>的实际类型;在编译阶段,把实参传递给形参。

在泛型中传递参数的方式

public class ArrayList<E>{
		
}

           声明了一个泛型
           为ArrayList创建对象

ArrayList<Person> pList = new ArrayList<Person>();
public interface PersonDao<E>{
		
}
public interface P<E> extends PersonDao<E>{
		   
}
public class PersonDaoImpl implements P<Person>{
		   
}

例如ArrayList:
            ArrayList<Person>-->ArrayList<E>-->【AbstractList<E> | List<E> 】-->AbstractCollection<E>-->Collection<E>

实际的应用:重构dao

示例:1、cn/itcast/shoa/dao/base/BaseDao

package cn.itcast.shoa.dao.base;

import java.io.Serializable;
import java.util.Collection;

public interface BaseDao<E>{
	/**
	 * 得到E代表的所有的实体对象
	 * @return
	 */
	public Collection<E> getAllEntry();
	/**
	 * Serializable该类型可以接受所有的基本类型和String类型
	 * @param id
	 * @return
	 */
	public E getEntryById(Serializable id);
	
	public void saveEntry(E e);
	
	public void deleteEntry(Serializable id);
	
	public void updateEntry(E e);
}

    2、实现类:cn/itcast/shoa/dao/base/impl/BaseDaoImpl

package cn.itcast.shoa.dao.base.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.HashSet;

import javax.annotation.Resource;

import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.HibernateTemplate;

import cn.itcast.shoa.dao.base.BaseDao;

public class BaseDaoImpl<E> implements BaseDao<E>{
	
	private Class classt;
	
	public BaseDaoImpl(){
		/**
		 * 1、this可以代表子类或者本类
		 * 2、不能把BaseDaoImpl在spring容器中实例化,因为如果在spring容器中实例化,则就不是泛型了
		 * 3、所以根据以上两点可以得出this应该代表子类
		 * 4、this.getClass().getGenericSuperclass()代表当前的类:就是泛型
		 * 5、注意:不能把BaseDaoImpl让spring容器实例化
		 */
		ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
		//因为将来E代表的是某一个持久化类,而该类型是class
		this.classt = (Class)type.getActualTypeArguments()[0];
	}
	
	@Resource(name="hibernateTemplate")
	public HibernateTemplate hibernateTemplate;

	@Override
	public Collection<E> getAllEntry() {
		// TODO Auto-generated method stub
		return this.hibernateTemplate.find("from "+this.classt.getName());
	}
	@Override
	public E getEntryById(Serializable id) {
		// TODO Auto-generated method stub
		/**
		 * classMetadata是持久化类的数据字典
		 */
		ClassMetadata classMetadata =  this.hibernateTemplate.getSessionFactory().getClassMetadata(this.classt);
		return (E)this.hibernateTemplate.
					find("from "+this.classt.getName()
							+
							" where "
							+classMetadata.getIdentifierPropertyName()
							+"=?",
							id).get(0);
	}
	@Override
	public void saveEntry(E e) {
		// TODO Auto-generated method stub
		this.hibernateTemplate.save(e);
	}
	@Override
	public void deleteEntry(Serializable id) {
		// TODO Auto-generated method stub
		E e = this.getEntryById(id);
		this.hibernateTemplate.delete(e);
	}
	@Override
	public void updateEntry(E e) {
		// TODO Auto-generated method stub
		this.hibernateTemplate.update(e);
	}
}

以上是针对之前的项目做的一点知识补充,有关Java泛型的学习,这里有一篇博客值得参考:http://www.importnew.com/24029.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值