- 浏览: 305771 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
u014212273:
好文一枚
log4j日志配置 -
向奕昌:
你好,能否提供下你那个测试dll
Java调用.dll文件 -
GARUDA183:
谢谢分享。
Flex中文帮助文档以及ActionScript3的中文文档 -
木叶之舟:
感谢楼主分享
Flex中文帮助文档以及ActionScript3的中文文档 -
游其是你:
呵呵,谢谢啦,好人一生平安~
Flex中文帮助文档以及ActionScript3的中文文档
之前了解学习了C#的语言特征,的确,C#是很好的面向对象的语言,感觉很多跟JAVA大致相同,同时Microsoft给它新增了很多令人心动的特性,比如结构、泛型(这个跟C++的模板类似)、Foreach……这些都带来了很多方便。
JDK的更新日渐变化,越来完善的功能,给程序员带来很多便利。比如JDK5.0的泛型就是一个非常好的例子。下面讨论一下JAVA的泛型,仅供参考。
泛型的优势
利用泛型设计,可以使编写的代码为不同类型所重用。在JDK5.0之前泛型设计是由继承来实现。比如:
java 代码
- public static void getList(){
- List list = new ArrayList();
- String str = (String)list.get(1);
- }
这段代码中的ArrayLIst的get()方法是由继承Object来实现泛型的,所以在get()时必然要进行类型强制转换,可以查看JDK5.0以前的源程序,应该如下;
java 代码
- public class ArrayList{
- public Object get(int index) {}
- public boolean add(Object o) {}
- }
java 代码
java 代码[code]
- public static void getList(){
- List<String> list = new ArrayList<String>();
- list.add(new String("1111"));
- String str = list.get(0);
- System.out.println(str);
- }
通过<>内指定的类型参数,我们就可以很直观的知道List的类型,不需要强制的进行转换,避免了异常,编绎器也直接利用这个类型参数信息,能直接按类型参数处理,而且不是按Obejct来处理,相对更安全,同时编绎器会检查输入的类型是不是<>是指定的参数类型,如是要不是刚编绎无法通过,这当然要比在运行时异常要好啦。
泛型类的定义
要定义一个泛型类,其实也不是很难,下面我们定义一个有两个变量的泛型类。 [code]
java 代码
- public class ClassOne <T extends IClass,U>{
- private T a;
- private U b;
- public T getA() {
- return a;
- }
- public void setA(T a) {
- this.a = a;
- }
- public U getB() {
- return b;
- }
- public void setB(U b) {
- this.b = b;
- }
- }
[/code]
这里的ClassOne类,定义了两个变量类型参数,分别为T、U,按照Java文档中的说法,使用泛型定义命名时,E为集合的元素类型,K和V表示关键字和值的类型,T表示任意类型。其中可以看到T 继承了IClass接口,在泛型的定义中如果类继承父类或实现接口都用关键字"extends"来表示,如果是多个父类或接口可以用“&”连接,这说明T这个类型参数的类型必然继承IClass或实现IClass接口.
泛型方法的定义
下面看IClass接口,里面有一个泛型方法: [code]
java 代码
- public interface IClass {
- public <T> T view(T str);
- }
IClass接口中只有一个view()方法,实现查看的功能。先定义一个ClassTwo实现IClass接口中的泛型方法view()。 [code]
java 代码
- public class ClassTwo implements IClass{
- public <T> T view(T str) {
- System.out.println(str);
- return str;
- }
- }
再看具体的ClassOne的实例调用 ,下面实例化ClassOne的类[code]
java 代码
- public static void main(String[] args) {
- ClassTwo t = new ClassTwo();
- ClassOne<ClassTwo,Integer> c = new ClassOne<ClassTwo,Integer>();
- c.setA(t);
- c.setB(new Integer(0));
- c.getA().<String>view(new String(""));
- }
以上说明了定义泛型类和泛型方法,有点像C++的模板,但是又不相同,当然我上面只是简单的介绍一些特性,更多信息需要参考JDK的文档。
遍历特性(foreach)
下面再来说明一个JDK5.0的新特性,这个就是foreach,在C#语言中,经常看到这样的:
c# 代码
- public static void ListTest()
- {
- string a = "jody",b="anita";
- ArrayList list = new ArrayList();
- list.Add(a);
- list.Add(b);
- foreach (string str in list)
- {
- Console.WriteLine(str);
- }
- }
C#代码的foreach{}非常方便的便遍历出ArrayList中的数据,并且不需要索引。而且JDK5.0以前需要进行如下:
java 代码
- public static void iterator(){
- List list = new ArrayList();
- Iterator it = list.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
java 代码
- public static void iterator1(){
- List list = new ArrayList();
- for(int i=0;i
- System.out.println(list.get(i));
- }
- }
如果是用JDK5.0以上,则可以像C#中一样,用for直接遍历出数据,不需要指定索引。 [code]
java 代码
- public static void getList1(){
- List<String><string></string> list = new ArrayList<String><string></string>();
- for(String str : list){
- System.out.println(str);
- }
- }
上面说明了JDK5.0以后版本的两个新特性,其中都与C++和C#语言中的思想差不多,现在JDK6.0\7.0都快出来了,应该有更多让人惊喜的功能,比如听说会封装WebService的实现。的确是很期待的
评论
7 楼
zexunlee
2007-08-21
正好在JDK5的研究泛型机制。
6 楼
birdjavaeye
2007-08-21
Chamjoneu 写道
范性另一个大的优势在于解决了 不必要的装箱 和 拆箱 问题
java泛型不能减少box unbox,不允许List<int>,得用List<Integer>
而C#支持<int>这样的,虚拟机对这种值类型有优化,能减少box unbox
5 楼
过儿oO
2007-08-21
laiseeme 写道
那你还是老老实实用原先那种循环
看来只有如此了
4 楼
laiseeme
2007-08-21
那你还是老老实实用原先那种循环
3 楼
过儿oO
2007-08-21
List<String> list = new ArrayList<String>(); for(String str : list) { System.out.println(str); }
玩了一下这个,这个for循环如果我想判断是容器中的哪个元素怎么办?
2 楼
Chamjoneu
2007-08-20
<br/>
<strong>tvjody 写道:</strong><br/>
<div class='quote_div'>
<p><strong><font size='4'>泛型的优势</font></strong><br/>
利用泛型设计,可以使编写的代码为不同类型所重用。在JDK5.0之前泛型设计是由继承来实现。比如:<br/>
</p>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> getList(){ </span></span> </li>
<li class=''><span> List list = </span><span class='keyword'>new</span><span> ArrayList(); </span> </li>
<li class='alt'><span> String str = (String)list.get(</span><span class='number'>1</span><span>); </span> </li>
<li class=''><span>} </span> </li>
</ol>
</div>
<br/>
这段代码中的ArrayLIst的get()方法是由继承Object来实现泛型的,所以在get()时必然要进行类型强制转换,可以查看JDK5.0以前的源程序,应该如下;
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> ArrayList{ </span></span> </li>
<li class=''><span> </span><span class='keyword'>public</span><span> Object get(</span><span class='keyword'>int</span><span> index) {} </span> </li>
<li class='alt'><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>boolean</span><span> add(Object o) {} </span> </li>
<li class=''><span>} </span> </li>
</ol>
</div>
这种实现,在add()时没有进行有效性检查,可以增加任何类型,同时在get()需要进行强制类型转换时,可能会抛出异常,而且代码不直观。如果你使用JDK5.0的泛型设计,则可以避免上述情况:
<div class='code_title'>java 代码</div>
<div class='code_title'>java 代码
通过<>内指定的类型参数,我们就可以很直观的知道List的类型,不需要强制的进行转换,避免了异常,编绎器也直接利用这个类型参数信息,能直接按类型参数处理,而且不是按Obejct来处理,相对更安全,同时编绎器会检查输入的类型是不是<>是指定的参数类型,如是要不是刚编绎无法通过,这当然要比在运行时异常要好啦。<br/>
<br/>
<br/>
<br/>
<br/>
</div>
<strong><font size='4'>范性另一个大的优势在于解决了 不必要的装箱 和 拆箱 问题</font></strong>
<strong>tvjody 写道:</strong><br/>
<div class='quote_div'>
<p><strong><font size='4'>泛型的优势</font></strong><br/>
利用泛型设计,可以使编写的代码为不同类型所重用。在JDK5.0之前泛型设计是由继承来实现。比如:<br/>
</p>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> getList(){ </span></span> </li>
<li class=''><span> List list = </span><span class='keyword'>new</span><span> ArrayList(); </span> </li>
<li class='alt'><span> String str = (String)list.get(</span><span class='number'>1</span><span>); </span> </li>
<li class=''><span>} </span> </li>
</ol>
</div>
<br/>
这段代码中的ArrayLIst的get()方法是由继承Object来实现泛型的,所以在get()时必然要进行类型强制转换,可以查看JDK5.0以前的源程序,应该如下;
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> ArrayList{ </span></span> </li>
<li class=''><span> </span><span class='keyword'>public</span><span> Object get(</span><span class='keyword'>int</span><span> index) {} </span> </li>
<li class='alt'><span> </span><span class='keyword'>public</span><span> </span><span class='keyword'>boolean</span><span> add(Object o) {} </span> </li>
<li class=''><span>} </span> </li>
</ol>
</div>
这种实现,在add()时没有进行有效性检查,可以增加任何类型,同时在get()需要进行强制类型转换时,可能会抛出异常,而且代码不直观。如果你使用JDK5.0的泛型设计,则可以避免上述情况:
<div class='code_title'>java 代码</div>
<div class='code_title'>java 代码
</div> <div class='dp-highlighter'> <div class='bar'/> <ol class='dp-j'> <li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> getList(){ </span></span> </li> <li class=''><span> List<font color='#ff0000'><</font>String<font color='#ff0000'>></font> list = </span><span class='keyword'>new</span><span> ArrayList<font color='#ff0000'><</font>String<font color='#ff0000'>></font>(); </span> </li> <li class='alt'><span> list.add(</span><span class='keyword'>new</span><span> String(</span><span class='string'>"1111"</span><span>)); </span> </li> <li class=''><span> String str = list.get(</span><span class='number'>0</span><span>); </span> </li> <li class='alt'><span> System.out.println(str); </span> </li> <li class=''><span>} </span> </li> </ol> </div><br/>
通过<>内指定的类型参数,我们就可以很直观的知道List的类型,不需要强制的进行转换,避免了异常,编绎器也直接利用这个类型参数信息,能直接按类型参数处理,而且不是按Obejct来处理,相对更安全,同时编绎器会检查输入的类型是不是<>是指定的参数类型,如是要不是刚编绎无法通过,这当然要比在运行时异常要好啦。<br/>
<br/>
<br/>
<br/>
<br/>
</div>
<strong><font size='4'>范性另一个大的优势在于解决了 不必要的装箱 和 拆箱 问题</font></strong>
1 楼
tvjody
2007-08-17
JavaEye的HTML编辑器会把“<>”以及之间的内容替换掉,而泛型是的类型参数是用<>来定义的,所以这里用"[ ]"代表"<>"
具体问题已经跟管理员联系了
具体问题已经跟管理员联系了
发表评论
-
身份证号码分析
2009-04-21 19:01 2909身份证号码工具类 身份证号码规则 摘自百度: [根 ... -
java源程序加密
2009-03-22 11:12 2145Java程序的源代码很容易 ... -
NoClassDefFoundError:org/jboss/mx/util/PropertyAcc
2009-01-15 17:14 4129在项目工程中,无故出现如下异常: java.lang.No ... -
JVM内存不足异常
2008-07-01 13:24 2514JVM内存不足异常 Web Server中布署项目,出现内 ... -
开发中一些常用的加密算法
2008-06-25 17:02 1361开发过程中常用的到的一些加密算法。 一般常用的有: MD5 ... -
Apache Ant包进行ZIP文件压缩
2008-05-27 00:47 4992Apache Ant包进行ZIP文件压 ... -
Oracle的varchar2(4000)插入汉字过长
2008-04-26 13:04 5555在使用oracle时,如果在一个varchar2(4000)的 ... -
定时执行任务的方法
2008-04-08 12:13 1971定时执行任务的三种方法: 1)java.util.Timer. ... -
JSP\Servlet中的Filter(过滤器)应用
2008-01-12 11:31 8086做B/S的企业级应用,可能会遇到这样一种情况,客户的文档(wo ... -
用get方法传递中文参数时出现乱码的解决方法
2007-12-28 11:04 4381可先用java.net.URLEncoder.encode(& ... -
Java调用.dll文件
2007-09-20 14:40 66030因为项目的需求,要在JAVA项目中调用Windows的Dll( ... -
关于读取配置文件Parsing failed.的问题
2007-09-07 17:12 13511今天将测试通过的应用,发给售前工程师在客户那进行安装,马上出现 ... -
Proxool连接池实现
2007-08-28 17:45 6876[code] 首先从 http://proxool.sour ... -
dbcp连接池实现
2007-08-27 17:22 13335DBCP是Apache的一个开源项目: commons.dbc ... -
log4j日志配置
2007-08-23 11:02 26061日志是应用软件中不可缺少的部分,Apache的开源项目Log4 ... -
Tomcat超过最大线程数出错,如何捕获异常
2007-08-22 12:56 5894Tomcat的server.xml中连接器设置如下 [code ... -
Discuz! Passport 的AzDGCrypt算法
2007-08-14 15:06 4377前段时间客户(某电信公司)要求,我们公司的产品需要实现与他们的 ...
相关推荐
《良葛格 JDK 5.0 学习笔记》是一本专为Java初学者设计的教程,涵盖了JDK 5.0版本中的重要特性和改进。JDK 5.0,也被称为Java SE 5.0,是Java发展历程中的一次重大更新,引入了许多关键性的新特性,对Java编程语言...
《良葛格Java JDK 5.0学习笔记》是一份专为初学者设计的Java编程教程,它以清晰明了的方式介绍了JDK 5.0版本中的核心概念和技术。这份PDF教程涵盖了Java语言的基础到进阶知识,是学习Java开发的理想资源。 1. **...
JDK5.0是Java SE(标准版)的一个重要版本,引入了许多新特性,如泛型、枚举、自动装箱/拆箱、变长参数等,提高了代码的可读性和可维护性。 【标签】"MyEclipse 7.0"是关键点,这是一款流行的Java集成开发环境,...
《良葛格Java JDK 5.0学习笔记》是一本专为Java初学者设计的教程,旨在帮助读者全面掌握JDK 5.0版本的核心概念和技术。这本书详细讲解了Java编程语言的基础,以及JDK 5.0引入的新特性,为初学者提供了深入理解和实践...
### JDK 5.0 新特性详解 #### 一、增强的 for 循环(ForEach Loop) JDK 5.0 引入了增强的 `for` 循环,也称为 foreach 循环,用于简化对集合和数组的操作。这种循环语法更加简洁,易于阅读。 **示例代码:** ``...
"SCJP考试模拟机——基于jdk5.0"是一款专门为准备SCJP考试的学员设计的模拟测试工具,它按照实际考试的标准和格式,帮助考生在家中或任何地方模拟真实的考试环境,提升备考效果。 这款模拟机的核心功能可能包括以下...
在这个项目中,开发者可能使用ExtJS 2.2.1 创建前端界面,通过AJAX与后端的MySQL 5.x 数据库进行数据交互,而JDK 5.0 则是Java服务器端程序的基础,用于处理HTTP请求、操作数据库以及提供Web服务。"Demo"可能是项目...
### 泛型在JDK 5.0中的实现 #### 泛型概述 在Java语言的传统设计中,允许异构集合的存在,这使得从集合中提取的对象必须进行类型转换才能正常使用,增加了编程复杂性。例如,当我们从一个集合中取出元素时,由于...
《良葛格java jdk 5.0学习笔记》是一份深入探讨Java编程语言核心特性的资源,特别针对Java Development Kit (JDK) 5.0版本。这份笔记旨在帮助初学者和有经验的开发者更好地理解和掌握Java 5.0的新特性,提升编程技能...
JDK是Java编程语言的核心组成部分,它提供了必要的工具、库文件和文档来支持Java应用程序的开发与运行。对于开发者而言,掌握不同版本的JDK特性及其变化至关重要。 ### JDK概述 JDK全称为Java Development Kit,是...
这个“jdk-1_5_0_22-linux-i586.rar_5.0版本_jdk_jdk-1_5_0_22_lakee6q_linux”文件包含了专为Linux i586架构设计的JDK 5.0的特定构建。 1. **泛型**:JDK 5.0引入了泛型,允许在编译时检查类型安全,减少了运行时...
泛型是Java编程语言的一个重要特性,引入于JDK 5.0。泛型允许在定义类、接口和方法时指定类型参数,从而在编译时期就能检查类型安全,并且可以消除运行时的类型检查和类型转换。在实现二级联动时,泛型可以帮助我们...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...
第20章 泛型程序设计 第21章 访问数据库 第22章 获取XML数据 第23章 处理电子邮件 第24章 JSP技术应用 第5篇 综合案例 第25章 汉诺塔游戏 第26章 学生成绩查询系统 第27章 网上用户注册系统下载地址
Java 泛型是Java编程语言中的一个重要特性,它在JDK 5.0版本中引入,目的是为了提高代码的类型安全性和重用性。泛型允许程序员在定义类、接口和方法时,指定一个或多个类型参数,这些参数在实际使用时会被具体的类型...
泛型是Java编程语言中的一个重要特性,它引入于JDK 5.0,主要用于提高代码的类型安全性和重用性。泛型允许我们在定义类、接口和方法时,使用一种称为类型参数的占位符,而不是具体的类型。这样,我们就可以在编译时...
Java学习笔记,主要聚焦于JDK 5.0版本,是良葛格个人学习过程中的心得与总结。这个压缩包包含的文件名为“良葛格Java JDK 5.0学习笔记”,显然,它是一个关于Java编程语言核心特性和JDK 5.0新功能的详细记录。 Java...