文档出处: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