`
温柔一刀
  • 浏览: 857625 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 范型编程

    博客分类:
  • java
阅读更多
1.一个简单的范型示例

在以前,你可能遇到过这样的代码:

1 List list  =   new  LinkedList(); 
2
3 list.add( " a " ); 
4
5 list.add( " b " ); 
6
7 list.add( " c " ); 
8
9 String name  =  (String)list.iterator.next(); 

注意,第三行需要强制转换。而使用范型:
 1
 2 List < String >  list  =   new  LinkedList < String > (); 
 3
 4 list.add( " a "
 5
 6 list.add( " b " ); 
 7
 8 list.add( " c " ); 
 9
10 String name  =  list.iterator.next(); 
11
12

这里将list声明成String类型的List。List是有一个类型参数的范型接口。这个例子中类型参数是String。

 
2.定义简单的范型

看j2se5.0中List和Iterator接口的实现(片断):
 1
 2 public   interface  List < E >   
 3
 4 {  
 5
 6 void  add(E x); 
 7
 8 Iterator < E >  iterator(); 
 9
10 }
 
11
12 public   interface  Iterator < E >   
13
14 {  
15
16 E next(); 
17
18 boolean  hasNext(); 
19
20 }
  
21
22

上面的代码我们比较熟悉,但是其中增加了尖括号。尖括号中的内容定义了接口List和Iterator的形式类型参数。类型参数可以用在范型声明中,如类和接口的声明。

一旦声明了范型,你就可以使用它。在上面的例子中使用了List<String>。这里使用String是实参,代替了形参E。如果使用List<Integer>,则用实参Integer代替了形参E。

不管List<Integer>还是List<String>,它们的类只有一个。考虑下面的代码:
1
2 List < String >  list1  =   new  LinkedList < String > (); 
3
4 List < Integer >  list2  =   new  LinkedList < Integer > (); 
5
6 System.out.println(list1.getClass() == list2.getClass()); 
7
 

输出结果为true。

 

一般来说,形式类型参数都是大写,尽量使用单个字母,许多容器类都使用E作为参数。

 

3.范型和继承

考虑下面的代码,你认为它会出错吗?

1
2 String s = " xxx@gmail.com "
3
4 Object o  =  s: 
5

当然,String类继承Object类,这样做不会出错。但下面的代码呢?

1 List < String >  s  =   new  LinkedList < String > (); 
2
3 List < Object > o = s; 
4


编译出错!

是的,List<Object>和List<String>没有继承关系。

 

4.通配符

考虑下面一个方法:

 1
 2 public   void  printCollection(Collection < Object >  c) 
 3
 4
 5
 6     for (Object o:c) 
 7
 8
 9
10    System.out.printf( " %s%n " ,o); 
11
12 }
 
13
14 }
 
15


事实上,上面这个方法并不通用,它只能打印Collection<Object>类型的集合,象其他的如Collection<String>、Collection<Integer>并不能被打印,因为对象类型不一致。

为了解决这个问题,可以使用通配符:
 1
 2 public   void  printCollection(Collection < >  c) 
 3
 4
 5
 6     for (Object o:c) 
 7
 8
 9
10    System.out.printf( " %s%n " ,o); 
11
12 }
 
13
14 }
 
15
16

Collection<?>被称作未知类型的集合。问号代表各种类型。

上面的读取集合中的数据时,我们采用Object类型。这样做时可以的,因为不管未知类型最终代表何种类型,它的数据都继承Object类,那么再考虑一下下面的代码:
1
2 Collection <?>  c  =   new  ArrayList < String > (); 
3
4 c.add( new  Object());   
5
6

这样做时错误的,因为我们不知道?代表何种类型,所以我们不能直接将Object增加到集合中,这会出现类型不匹配的情况。
 

5.有限制的通配符

考虑下面的代码
 1
 2 class  Man 
 3
 4
 5
 6     public  String name  = ""
 7
 8 }
 
 9
10 class  GoodMan  extends  Man 
11
12
13
14     public  String name  =   ""
15
16 }
 
17
18 class  BadMan  extends  Man 
19
20
21
22     public  String name  =   ""
23
24 }
 
25
26

考虑下面的范型方法:
 1
 2 public   void  printName(List < Man >  men) 
 3
 4
 5
 6     for (Man man:men) 
 7
 8    
 9
10       System.out.println( " 姓名: " +  man.name); 
11
12    }
 
13
14 }
 
15
16


这个范型方法只能显示List<Man>类型的数据,下面的代码允许显示Man和它的子类。
 1
 2 public   void  printName(List < ?  extends   Man >  men) 
 3
 4
 5
 6     for (Man man:men) 
 7
 8    
 9
10       System.out.println( " 姓名: "   +  man.name); 
11
12    }
 
13
14 }
 
15
16

这里使用? extends Man代替Man,表明接受任何Man的子类做为参数。

和前面的代码类似,下面的代码也是不正确的:
 1
 2 public   void  adman(List <?   extends  Man >  men) 
 3
 4
 5
 6    GoodMan good  =   new  GoodMan(); 
 7
 8    good.name  =   " zhupan "
 9
10    men.add(good); 
11
12 }
 
13
14

原因也很简单,因为?代表一切继承Man的类,你并不能保证就一定时GoodMan类。

 

和这种用法类似:
 1
 2 public   void  adman(List <?   super  GoodMan >  men) 
 3
 4
分享到:
评论

相关推荐

    java1.5范型编程指南

    java1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.doc

    Genetic Programming范型编程

    范型编程的好资料....

    C++ 设计新思维:范型编程与设计模式之应用

    C++ 设计新思维:范型编程与设计模式之应用

    Java 泛型(Generics)使用说明

    另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    暂时仅仅设计了以下几个功能点: 1.点对点单人聊天; 2.多人在线同时聊天; 3.用户可以自由加入和退出系统; 4.具备用户在线状态监听;

    七周七语言:理解多种编程范型

    编程喜C#、Ruby、Haskell而厌Java。 白明 Neusoft某开发部技术总监,拥有多年电信级软件开发经验;资深C程序员,对Common Lisp、Python等小众语言也有涉猎;对开源软件有着浓厚的兴趣,曾先后贡献了lcut、cbehave等...

    七周七语言:理解多种编程范型.pdf

    从计算机发展史早期的Cobol、Fortran到后来的C、Java,编程语言的家族不断壮大。除了这些广为人知的语言外,还涌现了Erlang、Ruby等后起之秀,它们虽被喻为小众语言,但因其独特性也吸引了为数不少的追随者。 Bruce...

    StudyJava:Java 基础学习(java编程思想和java技术核心卷)

    a)与“像是一个”(is-like-a)关系1.7 伴随多态的可互换对象1.8 单根继承结构1.9 容器1.9.1 参数化类型(范型)1.10 对象的创建和生命期1.11 异常处理:处理错误1.12 并发编程1.13 Java与Internet1.13.1 Web是什么...

    java 学习教学大纲笔记

    java 学习教学大纲笔记1.熟练掌握Java语言开发环境的配置 2.掌握Java语言的基本语法与编码规范 3.熟练掌握Java基本语法 4.熟练掌握数组的使用 5.掌握面向对向思想 6.掌握Java常用类 ...13.了解网络编程

    Thinking in java4(中文高清版)-java的'圣经'

    1.8 单根继承结构 1.9 容器 1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第...

    广州大学网络编程实验二代码(UDP编程)

    UDP协议在IP协议之上添加的功能虽然非常有限,但...通过完成本实验项目,巩固以前所学的面向对象的分析和设计技术,掌握UDP套接字的编程范型,熟悉Java对UDP协议的支持类的编程接口,并能熟练运用于UDP协议应用编程中。

    《JavaScript语言精髓与编程实践》精选版

    因此,事实上《JavaScript 语言精髓与编程实践》一书是假JavaScript 语言之力,讨论了我们常用的、主要的程序设计范型。而这也是该书难读的根源——很少有人会以一门确切的语言来讨论多种语言范型。尤其在使用...

    分布式计算实验-基于P2P范型的即时聊天系统.rar

    本次系统开发主要涉及到socket编程技术和多线程技术。为了保证数据收发的可靠性,本系统选择的是基于面向连接的通信方式,即用TCP套接字实现网络通信。套接字是通信的基础,这是支持网络通信协议的基本接口,套接字...

    AIC的Java课程1-6章

     课程目标  认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。  学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。  培养和建立面向对象编程...

    广州大学网络编程实验一代码(TCP编程)

    TCP协议是传输层中最重要的协议,它能满足应用对...通过完成实验项目,巩固以前所学的面向对象的分析和设计技术,掌握TCP套接字的编程范型,熟悉Java对TCP协议的支持类的编程接口,并能熟练运用于TCP协议应用编程中。

    thinking in Java 第四版中文 part1

    1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第2章 一切都是对象 2.1 用...

    opt_win64_21最新

    在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初...

    Java-notes:Java 知识梳理和学习笔记,计算机网络,数据结构,设计模式等

    Java 笔记 Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android...Java 并发编程 模块 编号

    北京达内 core java核心课件(含练习题)

    CoreJava 就是一门纯面向对象编程的语言。 学习方法很简单,就是模仿、改进、创新,循环往复。 二、 什么是字节码和虚拟机: 字节码是一套设计用来在Java 运行时系统下执行的高度优化的 指令集。该Java 运行...

    编程思想下篇

    1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第2章 一切都是对象 2.1 用...

Global site tag (gtag.js) - Google Analytics