Java型的研究与应用-科技论文
作者:中州期刊联盟来源:原创日期:2012-08-31人气:1309
在Java编程中,经常遇到众多对象的存取情况,比如在一个新闻系统中(假定新闻类为News),当从数据库中(即模型层)查询到某些新闻时,首先进行对象关系映射,也就是将每条新闻记录转变为一个News对象,然后再将News对象放入一个容器,在视图层显示时,从容器中将他们(News对象)一一取出,然后在视图层予以显示。
这个过程中,传统的处理方法是首先将News类作为Object类放入相应容器,读取时在再将容器中的每个对象(此时为Object类型)转型为对应的News类,然后进行相应的处理。
为了简单起见,我们用下面的代码来模拟上述过程。上述的处理过程很明了,但实际上隐含了一个错误,在程序的输出语句中,为了使用News类的方法,需要将对象强制转型为News类型,这个转型在编译阶段不会出现任何问题,但在运行时,却抛出ClassCastException转型异常,从而造成程序的异常终止。另外此程序的可读性也不好,因为我们在使用map容器取对象时,根本不知道其中存放的是什么对象。
在JDK1.4之前,在处理相似的问题时,别无他法,只能这样来处理,至于运行时异常,只能靠我们写程序时小心。
一、利用泛型解决上述问题
Java的泛型就是在定义的同时明确指名其类型,增强程序的可读性。同时类型的检查在编译阶段就可以完成,避免运行时的异常,从而使程序有更强的健壮性。
泛型的定义形式为:classJava_Generics<K,V>,这里边的K和V就像方法中的参数一样,代表类型。
在Java的类库中,使用变量E表示集合的元素类型,K和V分别表示关键字与值的类型。T(需要时还可以用临近的字母U和S)可以表示任意类型。
现在利用泛型来重写Test类中的main函数的部分关键代码,News类不变,更改如下:这段代码必须在JDK1.5或更高的版本上才能正确编译,注释掉的那行代码就是前面出现ClassCastException错误的原因。之所以被注释掉,是因为他在编译阶段就被发现了问题,必须做相应更改才能通过编译,提高了程序的健壮性。另外,当我们看到Map的定义的时候,很清楚能向Map中放入什么类型的对象,程序的可读性也大大增强。
基于上述示例的泛型应用在Java编程中的应用极为广泛,但都可以利用上述示例来方便的解决问题。在实际应用中,从容器中读出所有元素时,也可以利用Iterator指定。比如在一个List
容器中,把List转换为Iterator:Iteratorit=list.iterator();这是可以使用泛型的另外一个地方。
二、泛型使用应注意的问题
究竟什么类可以指定特定的对象,使用泛型呢?最简单有效的方法是查阅JDK的API帮助文档,凡是后面有或等尖括号的,就可以指定明确的类型
另外,在使用泛型编程时还要注意以下几点:
(1)不可以用一个基本类型(如intfloat)来替换泛型。
(2)泛型类不可以继承Exception类。
(3)不可以定义泛型数组。
(4)不可以用泛型构造对象,即:Newsnews=newT();是错误的。
(5)在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰。
总之,在Java语言中使用泛型,会大大增强程序的易读性和健壮性,把隐含错误消除在编译阶段。学习如何使用泛型类型相当简单,但是同样也需要防范一些可能出现的错误。
这个过程中,传统的处理方法是首先将News类作为Object类放入相应容器,读取时在再将容器中的每个对象(此时为Object类型)转型为对应的News类,然后进行相应的处理。
为了简单起见,我们用下面的代码来模拟上述过程。上述的处理过程很明了,但实际上隐含了一个错误,在程序的输出语句中,为了使用News类的方法,需要将对象强制转型为News类型,这个转型在编译阶段不会出现任何问题,但在运行时,却抛出ClassCastException转型异常,从而造成程序的异常终止。另外此程序的可读性也不好,因为我们在使用map容器取对象时,根本不知道其中存放的是什么对象。
在JDK1.4之前,在处理相似的问题时,别无他法,只能这样来处理,至于运行时异常,只能靠我们写程序时小心。
一、利用泛型解决上述问题
Java的泛型就是在定义的同时明确指名其类型,增强程序的可读性。同时类型的检查在编译阶段就可以完成,避免运行时的异常,从而使程序有更强的健壮性。
泛型的定义形式为:classJava_Generics<K,V>,这里边的K和V就像方法中的参数一样,代表类型。
在Java的类库中,使用变量E表示集合的元素类型,K和V分别表示关键字与值的类型。T(需要时还可以用临近的字母U和S)可以表示任意类型。
现在利用泛型来重写Test类中的main函数的部分关键代码,News类不变,更改如下:这段代码必须在JDK1.5或更高的版本上才能正确编译,注释掉的那行代码就是前面出现ClassCastException错误的原因。之所以被注释掉,是因为他在编译阶段就被发现了问题,必须做相应更改才能通过编译,提高了程序的健壮性。另外,当我们看到Map的定义的时候,很清楚能向Map中放入什么类型的对象,程序的可读性也大大增强。
基于上述示例的泛型应用在Java编程中的应用极为广泛,但都可以利用上述示例来方便的解决问题。在实际应用中,从容器中读出所有元素时,也可以利用Iterator指定。比如在一个List
容器中,把List转换为Iterator:Iteratorit=list.iterator();这是可以使用泛型的另外一个地方。
二、泛型使用应注意的问题
究竟什么类可以指定特定的对象,使用泛型呢?最简单有效的方法是查阅JDK的API帮助文档,凡是后面有或等尖括号的,就可以指定明确的类型
另外,在使用泛型编程时还要注意以下几点:
(1)不可以用一个基本类型(如intfloat)来替换泛型。
(2)泛型类不可以继承Exception类。
(3)不可以定义泛型数组。
(4)不可以用泛型构造对象,即:Newsnews=newT();是错误的。
(5)在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰。
总之,在Java语言中使用泛型,会大大增强程序的易读性和健壮性,把隐含错误消除在编译阶段。学习如何使用泛型类型相当简单,但是同样也需要防范一些可能出现的错误。
热门排行
推荐信息
期刊知识
- 2025年中科院分区表已公布!Scientific Reports降至三区
- 官方认定!CSSCI南大核心首批191家“青年学者友好期刊名单”
- 2023JCR影响因子正式公布!
- 国内核心期刊分级情况概览及说明!本篇适用人群:需要发南核、北核、CSCD、科核、AMI、SCD、RCCSE期刊的学者
- 我用了一个很复杂的图,帮你们解释下“23版最新北大核心目录有效期问题”。
- 重磅!CSSCI来源期刊(2023-2024版)最新期刊目录看点分析!全网首发!
- CSSCI官方早就公布了最新南核目录,有心的人已经拿到并且投入使用!附南核目录新增期刊!
- 北大核心期刊目录换届,我们应该熟知的10个知识点。
- 注意,最新期刊论文格式标准已发布,论文写作规则发生重大变化!文字版GB/T 7713.2—2022 学术论文编写规则
- 盘点那些评职称超管用的资源,1,3和5已经“绝种”了