学习泛型

文档出处:Generics in the Java Programming Language 官方文档

http://search.sun.com/main/index.jsp?charset=utf-8&col=main-developer-all&qt=generics&x=0&y=0

1.使用泛型的好处:

List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3 需要类型强制转换
List<Integer> myIntList = new LinkedList<Integer>();
myIntList.add(new Integer(0)); //2’
Integer x = myIntList.iterator().next(); // 3’ 方便

 
  提高程序的健壮性,类型安全上。

 

2. 泛型和子类

   类的父子关系不法关联到 泛型上

  比如 类B 是 类A 父类; 但是List<A> 与List<B>无法形成继承关系

  非要有继承关系那怎么办呢?使用通配符


3. 通配符
    ?  相当于 类中的Object 所有的父类

  List<?> list = new ArrayList<String>();

 

4 有限制的通配符

 

public abstract class Shape {
   public abstract void draw(Canvas c);
}
public class Circle extends Shape {
   private int x, y, radius;
   public void draw(Canvas c) { ... }
}
public class Rectangle extends Shape {
   private int x, y, width, height;
   public void draw(Canvas c) { ... }
}
These classes can be drawn on a canvas:
public class Canvas {
   public void draw(Shape s) {
   s.draw(this);
}
}
public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
     s.draw(this);
   }
} // 参数只能使用List<Shape> 而不能用 List<Circle>  and List<rectangle> 
所以要使用有限制的通配符
public void drawAll(List<? extends Shape> shapes) { ... }

 

5. 泛型方法
  public <T> void  formArrayToList(T[] o,List<T> list)
  public <T>  void copy(List<T> dest, List<? extends T> src)

在方法参数与参数 或者与返回值 有依赖关系的时候,通常使用泛型方法

 

6    同一个类可以有不同的类型,泛型的实例具有相同的运行时类型
 List<String> l1 = new ArrayList<String>();
       List<Integer> l2 = new ArrayList<Integer>();
       System.out.println(l1.getClass() == l2.getClass());

---------true

 

7. 通用Dao的代码

 

public class GenericDao<T> extends HibernateDaoSupport implements IGenericDao<T> {

	public T add(T t) {
		getHibernateTemplate().save(t);
		return t;
	}

	public void delete(T t) {
		getHibernateTemplate().delete(t);
	}

	public T get(T t, int id) {
		return (T)getHibernateTemplate().get(t.getClass(), id);
	}

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

}

 

测试
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	IGenericDao<TblUser> userDao = (IGenericDao<TblUser>)ac.getBean("genericDao");
	TblUser t = new TblUser();
	t.setUname("fangxing");
	t.setUpass("fanxing");
	System.out.println(userDao.add(t));

 

 

经测试,添加用户OK

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值