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, 代码如下: 

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);
}
}

  精华就是这句了:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

  泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和find()函数,销益挺明显的,所以 SpringSide的Dao基类毫不犹豫就泛型了。

  不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:
   
public class BookDao extends BaseHibernateEntityDao<Book>

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存

目录 Redis 介绍asp.net core Session 介绍Redis & Session 实例讲解Session的使用使用 Protobuf 给 Session添加扩展方法 Redis 介绍 下面是Redis官网的介绍&#xff1a; Redis is an open source (BSD licensed), in-memory data structure store, used as database, cac…

java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)

现在有个问题需要大家思考一下&#xff0c;有个已经上线了的项目&#xff0c;有好好几千甚至上万的客户在使用了。现在项目开发商想发布一个通知。在今天下午6点需要重新启动服务器&#xff0c;想让在线的人在在预定的时间内都收到消息&#xff0c;让大家做好相应的准备&#x…

Java和Android中的注解

转载自 Java和Android中的注解1.引言 从JDK1.5开始&#xff0c;引入了注解类Annotation&#xff0c;Annotation其实是一种接口&#xff0c;可以作用于类、方法、属性等等 &#xff0c;它可以通过反射机制来访问annotation信息&#xff0c;获取所加上注解信息&#xff0c;做相应…

第二章 指南(4.3)添加 View

原文&#xff1a;Adding a view作者&#xff1a;Rick Anderson翻译&#xff1a;魏美娟(初见)校对&#xff1a;赵亮(悲梦)、高嵩(Jack)、娄宇(Lyrics)、许登洋(Seay)、姚阿勇&#xff08;Dr.Yao&#xff09; 本节将修改 HelloWorldController 类&#xff0c;把使用 Razor 视图模…

java多表查询返回数据_spring data jpa如何在多张数据库表中查询返回某些字段值?...

对于多表联查需要使用springdata jpa的Query标注实现&#xff0c;例如最代码的我的私信列表的查询&#xff1a;public static final String POSTREPOSITORY_FINDALLBYTYPEANDGROUPBYUSERID "select id from (select id,target_id,case when user_id?1 and type?2 then …

JAVA反射修改常量,以及其局限

转载自 JAVA反射修改常量&#xff0c;以及其局限问题&#xff0c;以及一个解决方案 今天公司的JAVA项目碰到一个问题&#xff1a;在生成xls文件的时候&#xff0c;如果数据较多&#xff0c;会出现ArrayIndexOutOfBoundsException。Google发现是项中所用的jxl包&#xff08;开源…

java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目

题目描述我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 fromi 的楼搬到编号为 toi …

asp.net core 中间件详解及项目实战

前言 在上篇文章主要介绍了DotNetCore项目状况&#xff0c;本篇文章是我们在开发自己的项目中实际使用的&#xff0c;比较贴合实际应用&#xff0c;算是对中间件的一个深入使用了&#xff0c;不是简单的Hello World&#xff0c;如果你觉得本篇文章对你有用的话&#xff0c;不妨…

一分钟实现分布式锁

转载自 一分钟实现分布式锁一、缘起 分布式环境下&#xff0c;多台机器上多个进程对一个数据进行操作&#xff0c;如果不做互斥&#xff0c;就有可能出现“余额扣成负数”&#xff0c;或者“商品超卖”的情况&#xff0c;如何实现简易分布式锁&#xff0c;对分布式环境下的临界…

java建立线性表的链式结构_Java实现线性表的链式存储

本文实例为大家分享了Java实现线性表的链式存储&#xff0c;供大家参考&#xff0c;具体内容如下链表&#xff1a;一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。package algorithm.datastructure.linklist;import java.ut…

dotnet core 开发体验之Routing

开始 回顾上一篇文章&#xff1a;dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的&#xff0c;所以感觉需要研究一下Routing是什么鬼。 Routing简单使用体验 首先我们用命令yo aspnet创建一个新的空web项目。&#xff08;Yeo…

线程间协作的两种方式:wait、notify、notifyAll和Condition

转载自 线程间协作的两种方式&#xff1a;wait、notify、notifyAll和Condition在前面我们将了很多关于同步的问题&#xff0c;然而在现实中&#xff0c;需要线程之间的协作。比如说最经典的生产者-消费者模型&#xff1a;当队列满时&#xff0c;生产者需要等待队列有空间才能继…

格密码基础:q-ary格

目录 一. 格密码的重要性 二. 格密码基础 2.1 格点的另一种理解方式 三. q-ary格 3.1 q-ary垂直格 3.2 q-ary格 3.3 二者结合 四. 论文中的q-ary格 4.1 定理1 4.2 定理2 4.3 定理3 一. 格密码的重要性 格密码的基础是研究格点上的困难问题&#xff0c;这种格点使用…

java动脑公开课_java课堂动手动脑

实验任务一&#xff1a;阅读并运行示例PassArray.java.1)源代码&#xff1a;package demo;//PassArray.java//Passing arrays and individual array elements to methodspublic class PassArray {public static void main(String[] args) {int a[] { 1, 2, 3, 4, 5 };String o…

dotnet core开发体验之开始MVC

开始 在上一篇文章&#xff1a;dotnet core多平台开发体验 &#xff0c;体验了一把dotnet core 之后&#xff0c;现在想对之前做的例子进行改造&#xff0c;想看看加上mvc框架是一种什么样的体验&#xff0c;于是我就要开始诞生今天的这篇文章来分享我的感受了。 一、项目改造加…

Java时间处理第三方包:Joda-Time

转载自 Java时间处理第三方包&#xff1a;Joda-TimeJoda-Time provides a quality replacement for the Java date and time classes.Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (…

Visual Studio Code五月版本更新

开源项目、跨平台代码编辑器Visual Studio Code刚发布了其1.2版本&#xff08;虽然说是2016年5月发布&#xff0c;但其实是在6月交付的&#xff09;。和往常一样&#xff0c;这次发布的版本中对于很大一部分功能都进行了改善&#xff0c;其中最值得关注的可能是一种全新整合的终…

关于SimpleDateFormat时间格式化线程安全问题

转载自 关于SimpleDateFormat时间格式化线程安全问题昨天推送的文章《关于创建和销毁对象》一文中&#xff0c;2.1重复利用对象这一小节所举的SimpleDateFormat格式化时间的例子是不合适的&#xff0c;因为多线程场景下&#xff0c;SimpleDateFormat存在线程安全问题。在此&am…

聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

跨平台是ASP.NET Core一个显著的特性&#xff0c;而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server。KestrelServer利用一个名为KestrelEngine的网络引擎实现对请求的监听、接收和响应。KetrelServer之所以具有跨平台的特质&#xff0c;源于KestrelEngine是在一…

pdfbox java.lang.outofmemoryerror_Apache PDFBox 1.8.11 发布,Java 的 PDF 处理类

Apache PDFBox 1.8.11 发布&#xff0c;此版本是个增量 bug 修复版本&#xff0c;包括大量 bug 修复和改进。现已提供下载&#xff1a;主要改进内容&#xff1a;Bug 修复[PDFBOX-962] - All sort of Problems when importing Xfdf files into PDFs ->damaged pdfs and NPEs[…