Java5泛型的用法,T.class的获取和为擦拭法站台
转载自 Java5泛型的用法,T.class的获取和为擦拭法站台
Java 5的泛型语法已经有太多书讲了,这里不再打字贴书。GP一定有用,不然Java和C#不会约好了似的同时开始支持GP。但大家也清楚,GP和Ruby式的动态OO语言属于不同的意识形态,如果是一人一票,我想大部分的平民程序员更热衷动态OO语言的平白自然。但如果不准备跳槽到支持JSR223的动态语言,那还是看看GP吧。
胡乱总结泛型的四点作用:
第一是泛化,可以拿个T代表任意类型。 但GP是被C++严苛的静态性逼出来的,落到Java、C#这样的花语平原里----所有对象除几个原始类型外都派生于Object,再加上Java的反射功能,Java的Collection库没有范型一样过得好好的。
第二是泛型 + 反射,原本因为Java的泛型拿不到T.class而觉得泛型没用,最近才刚刚学到通过反射的API来获取T的Class,后述。
第三是收敛,就是增加了类型安全,减少了强制类型转换的代码。这点倒是Java Collection历来的弱项。
第四是可以在编译期搞很多东西,比如MetaProgramming。但除非能完全封闭于框架内部,框架的使用者和扩展者都不用学习这些东西的用法,否则那就是自绝于人民的票房毒药。C++的MetaProgramming好厉害吧,但对比一下Python拿Meta Programming生造一个Class出来的简便语法,就明白什么才是真正的叫好又叫座。
所以,作为一个架构设计师,应该使用上述的第2,3项用法,在框架类里配合使用反射和泛型,使得框架的能力更强; 同时采用收敛特性,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
擦拭法避免了Java的流血分裂 :
大家经常骂Java GP的擦拭法实现,但我觉得多亏于它的中庸特性---如果你用就是范型,不用就是普通Object,避免了Java阵营又要经历一场to be or not to be的分裂。
最大的例子莫过Java 5的Collection 框架, 比如有些同学坚持认为自己不会白痴到类型出错,而且难以忍受每个定义的地方都要带一个泛型定义List〈Book〉,不用强制类型转换所省下的代码还不够N处定义花的(对了,java里面还没有tyepdef.....),因此对范型十分不感冒,这时就要齐齐感谢这个搽拭法让你依然可以对一个泛型框架保持非泛型的用法了...
通过反射获得 T.class:
不知为何书上不怎么讲这个,是差沙告诉我才知道的,最经典的应用见Hibernate wiki的Generic Data Access Objects, 代码如下:
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);
}
}
精华就是这句了:
泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和find()函数,销益挺明显的,所以 SpringSide的Dao基类毫不犹豫就泛型了。
不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:
Java5泛型的用法,T.class的获取和为擦拭法站台相关推荐
- [转]Java5泛型的用法,T.class的获取和为擦拭法站台
本文转载用于个人学习,原文链接:http://www.blogjava.net/calvin/archive/2006/04/28/43830.html 今天在做通用的DAO时,遇到需要获取 实体类的 ...
- java反射获取泛型_如何通过Java反射获取泛型类型信息
前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能 ...
- Java 泛型实现方法 — 擦拭法
所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的. 例如,我们编写了一个泛型类Pair,这是编译器看到的代码: public class Pair<T> {private ...
- 泛型相关用法(day3)
一.instanceof 用法总结. instanceof属于java关键字之一,instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:boolean ...
- redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!
工作中遇到如下业务场景: 我需要利用大批量的key去借助MGET命令来获取redis服务器上的记录,但是我却始终获取不到.当然我可以使用GET去一条一条地获取,但是这样一来,效率不高.所以最好的方式是 ...
- java 泛型反射_Java使用反射来获取泛型信息示例
本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: ...
- jquery中cookie用法实例详解(获取,存储,删除等)
这篇文章主要介绍了jquery中cookie用法,结合实例详细分析了jQuery操作cookie的获取,存储,删除等操作,并附带了Jquery操作Cookie记录用户查询过信息实现方法,需要的朋友可以 ...
- Element UI 左侧折叠导航栏配合el-asid文字闪烁的问题,element-UI 中beforeLeave用法,echarts 无法获取属性“getAttribute”的值
Element UI 左侧折叠导航栏配合el-asid文字闪烁的问题 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eayAJOoj-1600259160168)(C: ...
- mybatis中useGeneratedKeys用法--插入数据库后获取主键值
前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获 ...
最新文章
- Struts2入门这一篇就够了
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- WEB开发者八项注意
- c mysql 设置字符集_C语言如何查看和修改MySQL使用的字符集
- VTK:可视化算法之ColoredAnnotatedCube
- 0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)
- SpringMVC 解决中文乱码的过滤器
- sql server 多条记录数据合并为一条_面试必备sql知识点——MySQL基础
- windows下MySQL 5.7+ 解压缩版安装配置方法
- python批处理代码_Python文件夹批处理操作代码实例
- java实现qq空间模块_Java实现模拟QQ空间图片上传
- html语言代码 输入文字,html语言教程文字代码:
- 4399ATAPI讲解操作事件篇
- 以太坊公链节点连接节点超时问题排查
- windows7内存诊断工具有用吗_用Windows内存诊断工具检查内存可靠性
- Method类及其用法
- 2021年全球与中国数字射线照相设备行业市场规模及发展前景分析
- 使用ffmpeg实现图像格式转换
- LoadRunner参数化
- 2022安徽省安全员C证试题及模拟考试
热门文章
- Mysql@和@@符号的详细使用说明
- [蓝桥杯2019初赛]修改数组-并查集
- 非递归遍历二叉树(算法导论第三版第十章10.4-5)
- 算法-连续项的最大和问题(最大子数组问题)三种不同解法
- Hystrix能解决的问题
- 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...
- 安卓listview下拉刷新_安卓QQ内测教学,保证不让你走弯路
- icoding复习3
- 数据结构基础概念、逻辑结构、物理结构
- Java web之web.xml配置详解