Java 的泛型语法已经有太多书讲了这里不再打字贴书GP一定有用不然Java和C#不会约好了似的同时开始支持GP但大家也清楚GP和Ruby式的动态OO语言属于不同的意识形态如果是一人一票我想大部分的平民程序员更热衷动态OO语言的平白自然但如果不准备跳槽到支持JSR的动态语言那还是看看GP吧 胡乱总结泛型的四点作用 第一是泛化可以拿个T代表任意类型 但GP是被C++严苛的静态性逼出来的落到JavaC#这样的花语平原里所有对象除几个原始类型外都派生于Object再加上Java的反射功能Java的Collection库没有范型一样过得好好的 第二是泛型 +反射原本因为Java的泛型拿不到Tclass而觉得泛型没用最近才刚刚学到通过反射的API来获取T的Class后述 第三是收敛就是增加了类型安全减少了强制类型转换的代码这点倒是Java Collection历来的弱项 第四是可以在编译期搞很多东西比如MetaProgramming但除非能完全封闭于框架内部框架的使用者和扩展者都不用学习这些东西的用法否则那就是自绝于人民的票房毒药C++的MetaProgramming好厉害吧但对比一下Python拿Meta Programming生造一个Class出来的简便语法就明白什么才是真正的叫好又叫座 所以作为一个架构设计师应该使用上述的第项用法在框架类里配合使用反射和泛型使得框架的能力更强 同时采用收敛特性本着对人民负责的精神用泛型使框架更加类型安全更少强制类型转换 擦拭法避免了Java的流血分裂 大家经常骂Java GP的擦拭法实现但我觉得多亏于它的中庸特性如果你用就是范型不用就是普通Object避免了Java阵营又要经历一场to be or not to be的分裂 最大的例子莫过Java 的Collection 框架比如有些同学坚持认为自己不会白癡到类型出错而且难以忍受每个定义的地方都要带一个泛型定义List〈Book〉不用强制类型转换所省下的代码还不够N处定义花的(对了java里面还没有tyepdef)因此对范型十分不感冒这时就要齐齐感谢这个搽拭法让你依然可以对一个泛型框架保持非泛型的用法了 通过反射获得 Tclass 不知为何书上不怎么讲这个是差沙告诉我才知道的最经典的应用见Hibernate wiki的Generic Data Access Objects 代码如下 abstractpublicclassBaseHibernateEntityDao<T>extendsHibernateDaoSupport{ privateClass<T>entityClass; publicBaseHibernateEntityDao(){ entityClass=(Class<T>) ((ParameterizedType) getClass() getGenericSuperclass())getActualTypeArguments()[]; } publicTget(Serializableid){ To=(T)getHibernateTemplate()get(entityClassid); } } 精华就是这句了 Class<T>entityClass=(Class<T>)((ParameterizedType)getClass()getGenericSuperclass())getActualTypeArguments()[]; 泛型之后所有BaseHibernateEntityDao的子类只要定义了泛型就无需再重载getEnttityClass()get()函数和find()函数销益挺明显的所以SpringSide的Dao基类毫不犹豫就泛型了 不过擦拭法的大棒仍在所以子类的泛型语法可不能乱写最正确的用法只有 publicclassBookDaoextendsBaseHibernateEntityDao<Book> |