泛型通配符和边界
ValueHolder<?>表示能匹配任何实际的类型,其中<?>称之为通配符类型(wildcard type)。在使用通配符类型的变量上,我们不能调用任何含有通配符类型参数的方法(除非这些参数设置为null值,因为null可以是任何类型的成员)。在一些场合中,我们希望能够限制<?>能匹配的类型范围,从而能够做一些更有意义的事情,我们可以给<?>加上一个边界。
<? extends InterfaceOrClass>表示只能匹配那些继承指定接口或者类的子类(或者子接口),这时我们称InterfaceOrClass为类型通配符的上界(upper bound of the wildcard)。
<?>也可以理解为<? extends Object>,这时Object就是上界,实际上也就是所有类型,因为所有类型的根都是Object。
<? super InterfaceOrClass>表示只能匹配指定接口或者类的超类(或者实现的接口),这时我们称InterfaceOrClass为类型通配符的下界(lower bound of the wildcard)。
泛型的定义:
1.类定义
2.方法定义
泛型通配符:
1.?
2.上限
3.下限
T.class的取得方式及其限制:
不知为何书上不怎么讲这个,是差沙告诉我才知道的,最经典的应用见Hibernate wiki的 Generic Data Access Objects, 代码如下:
abstract
public
class
BaseHibernateEntityDao
<
T
>
extends
HibernateDaoSupport {
private Class<T> entityClass;
public BaseHibernateEntityDao() {
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public T get(Serializable id) {
T o = (T) getHibernateTemplate().get(entityClass, id);
}
}
private Class<T> entityClass;
public BaseHibernateEntityDao() {
entityClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public T get(Serializable id) {
T o = (T) getHibernateTemplate().get(entityClass, id);
}
}
精华就是这句了:
Class
<
T
>
entityClass
=
(Class
<
T
>
) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[
0
];
泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和 find()函数,销益挺明显的,所以 SpringSide的Dao基类毫不犹豫就泛型了。
不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:
public
class
BookDao
extends
BaseHibernateEntityDao
<
Book
>