- 浏览: 857671 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yukang1:
蚂蚁lovejing 写道我也出现与楼上相同的问题。查了一些资 ...
Spring中实现文件上传 -
史玉凤:
必须用ie浏览器
javascript获取客户端网卡MAC地址和IP地址和计算机名 -
蚂蚁lovejing:
我也出现与楼上相同的问题。查了一些资料,描述的跟楼主的博文差不 ...
Spring中实现文件上传 -
温柔一刀:
djlijian 写道最近也在研究redis,如何在项目中使用 ...
Redis 常见的性能问题和解决方法 -
djlijian:
最近也在研究redis,如何在项目中使用呢?感觉网上的资料太少 ...
Redis 常见的性能问题和解决方法
1.一个简单的范型示例
在以前,你可能遇到过这样的代码:
注意,第三行需要强制转换。而使用范型:
这里将list声明成String类型的List。List是有一个类型参数的范型接口。这个例子中类型参数是String。
2.定义简单的范型
看j2se5.0中List和Iterator接口的实现(片断):
上面的代码我们比较熟悉,但是其中增加了尖括号。尖括号中的内容定义了接口List和Iterator的形式类型参数。类型参数可以用在范型声明中,如类和接口的声明。
一旦声明了范型,你就可以使用它。在上面的例子中使用了List<String>。这里使用String是实参,代替了形参E。如果使用List<Integer>,则用实参Integer代替了形参E。
不管List<Integer>还是List<String>,它们的类只有一个。考虑下面的代码:
输出结果为true。
一般来说,形式类型参数都是大写,尽量使用单个字母,许多容器类都使用E作为参数。
3.范型和继承
考虑下面的代码,你认为它会出错吗?
当然,String类继承Object类,这样做不会出错。但下面的代码呢?
编译出错!
是的,List<Object>和List<String>没有继承关系。
4.通配符
考虑下面一个方法:
事实上,上面这个方法并不通用,它只能打印Collection<Object>类型的集合,象其他的如Collection<String>、Collection<Integer>并不能被打印,因为对象类型不一致。
为了解决这个问题,可以使用通配符:
Collection<?>被称作未知类型的集合。问号代表各种类型。
上面的读取集合中的数据时,我们采用Object类型。这样做时可以的,因为不管未知类型最终代表何种类型,它的数据都继承Object类,那么再考虑一下下面的代码:
这样做时错误的,因为我们不知道?代表何种类型,所以我们不能直接将Object增加到集合中,这会出现类型不匹配的情况。
5.有限制的通配符
考虑下面的代码
考虑下面的范型方法:
这个范型方法只能显示List<Man>类型的数据,下面的代码允许显示Man和它的子类。
这里使用? extends Man代替Man,表明接受任何Man的子类做为参数。
和前面的代码类似,下面的代码也是不正确的:
原因也很简单,因为?代表一切继承Man的类,你并不能保证就一定时GoodMan类。
和这种用法类似:
在以前,你可能遇到过这样的代码:
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();
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
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
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
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
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
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
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
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
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
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
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
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
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
2 public void adman(List <? super GoodMan > men)
3
4
发表评论
-
Spring Integration 1.0 发布
2008-11-20 14:34 2086终于迎来了spring integration的第一个fina ... -
When To Use Mock Objects?
2008-06-10 10:18 1574The real object has nondeterm ... -
JACOB发送传真
2008-03-21 19:46 3768JACOB一个JAva-COM中间件.通过这个组件你可以在Ja ... -
IDEA快捷键
2007-04-30 12:16 5547最常用快捷键 1.Ctrl+E,可以显示最近编辑的文件列表 2 ... -
Ant+Tomcat自动部署的小问题
2007-02-14 18:00 8410今天用Ant对dms系统进行Tomcat的自动部署。 通过a ... -
FCKeditor-2.3在线编辑器,可以直接用的(java版)
2007-02-12 12:11 39380初次使用FCKeditor编辑器, 在网上搜索了半天也没有找 ... -
Java是剑客-飘逸;.NET是刀客-霸道
2006-12-26 19:17 4918网上看到的一篇 ... -
常用到的Eclipse快捷键
2006-11-11 12:13 3364Ctrl+s 存盘 Ctrl+/ ... -
java操作Excel、PDF文件
2006-10-09 16:41 36215下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是 ... -
通过SCJP考试,说点体会和感受
2006-04-25 18:58 4847我就随便说说哈,不认可的朋友就当没有看见哈! 1、首先声明下 ... -
使用smartupload进行文件的上传下载
2006-06-07 23:30 5268jspSmartUpload是由www.jspsmart.co ... -
log4j的配置文件例子
2006-07-09 04:27 2994log4j的配置文件例子,非常方便的一个开源日志软件,一直用它 ... -
javaBean数据库连接池
2006-07-09 04:35 2676实现简单的数据库连接池: java 代码 / ... -
用java实现浮点数的精确计算
2006-07-13 22:28 2886问题的提出: 如果我们编译运行下面这个程序会看到什么? j ... -
工厂模式
2006-07-13 22:30 5109简单工厂模式 1. 目的 工厂模式就是专门负 ... -
61条面向对象设计的经验原则
2006-07-13 22:51 1822(1)所有数据都应该隐藏在所在的类的内部。 (2)类的使用者必 ... -
追MM与java的32种模式
2006-07-13 22:55 1811创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当 ... -
OO的五大原则
2006-07-14 19:25 4722OO的五大原则是指SRP ... -
JAVA系列之对象的序列化与反序列化
2006-07-17 09:09 177881 简介 对象序列化(Seria ... -
java获取服务器端网卡地址
2006-08-08 19:43 4248java 代码 package com.ctgu ...
相关推荐
java1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.docjava1.5范型编程指南.doc
范型编程的好资料....
C++ 设计新思维:范型编程与设计模式之应用
另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java...
暂时仅仅设计了以下几个功能点: 1.点对点单人聊天; 2.多人在线同时聊天; 3.用户可以自由加入和退出系统; 4.具备用户在线状态监听;
编程喜C#、Ruby、Haskell而厌Java。 白明 Neusoft某开发部技术总监,拥有多年电信级软件开发经验;资深C程序员,对Common Lisp、Python等小众语言也有涉猎;对开源软件有着浓厚的兴趣,曾先后贡献了lcut、cbehave等...
从计算机发展史早期的Cobol、Fortran到后来的C、Java,编程语言的家族不断壮大。除了这些广为人知的语言外,还涌现了Erlang、Ruby等后起之秀,它们虽被喻为小众语言,但因其独特性也吸引了为数不少的追随者。 Bruce...
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 学习教学大纲笔记1.熟练掌握Java语言开发环境的配置 2.掌握Java语言的基本语法与编码规范 3.熟练掌握Java基本语法 4.熟练掌握数组的使用 5.掌握面向对向思想 6.掌握Java常用类 ...13.了解网络编程
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协议在IP协议之上添加的功能虽然非常有限,但...通过完成本实验项目,巩固以前所学的面向对象的分析和设计技术,掌握UDP套接字的编程范型,熟悉Java对UDP协议的支持类的编程接口,并能熟练运用于UDP协议应用编程中。
因此,事实上《JavaScript 语言精髓与编程实践》一书是假JavaScript 语言之力,讨论了我们常用的、主要的程序设计范型。而这也是该书难读的根源——很少有人会以一门确切的语言来讨论多种语言范型。尤其在使用...
本次系统开发主要涉及到socket编程技术和多线程技术。为了保证数据收发的可靠性,本系统选择的是基于面向连接的通信方式,即用TCP套接字实现网络通信。套接字是通信的基础,这是支持网络通信协议的基本接口,套接字...
课程目标 认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。 学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。 培养和建立面向对象编程...
TCP协议是传输层中最重要的协议,它能满足应用对...通过完成实验项目,巩固以前所学的面向对象的分析和设计技术,掌握TCP套接字的编程范型,熟悉Java对TCP协议的支持类的编程接口,并能熟练运用于TCP协议应用编程中。
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 用...
在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初...
Java 笔记 Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android...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 用...