- 浏览: 862600 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 2128终于迎来了spring integration的第一个fina ... -
When To Use Mock Objects?
2008-06-10 10:18 1611The real object has nondeterm ... -
JACOB发送传真
2008-03-21 19:46 3820JACOB一个JAva-COM中间件.通过这个组件你可以在Ja ... -
IDEA快捷键
2007-04-30 12:16 5581最常用快捷键 1.Ctrl+E,可以显示最近编辑的文件列表 2 ... -
Ant+Tomcat自动部署的小问题
2007-02-14 18:00 8441今天用Ant对dms系统进行Tomcat的自动部署。 通过a ... -
FCKeditor-2.3在线编辑器,可以直接用的(java版)
2007-02-12 12:11 39451初次使用FCKeditor编辑器, 在网上搜索了半天也没有找 ... -
Java是剑客-飘逸;.NET是刀客-霸道
2006-12-26 19:17 4962网上看到的一篇 ... -
常用到的Eclipse快捷键
2006-11-11 12:13 3395Ctrl+s 存盘 Ctrl+/ ... -
java操作Excel、PDF文件
2006-10-09 16:41 36291下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是 ... -
通过SCJP考试,说点体会和感受
2006-04-25 18:58 4882我就随便说说哈,不认可的朋友就当没有看见哈! 1、首先声明下 ... -
使用smartupload进行文件的上传下载
2006-06-07 23:30 5302jspSmartUpload是由www.jspsmart.co ... -
log4j的配置文件例子
2006-07-09 04:27 3022log4j的配置文件例子,非常方便的一个开源日志软件,一直用它 ... -
javaBean数据库连接池
2006-07-09 04:35 2726实现简单的数据库连接池: java 代码 / ... -
用java实现浮点数的精确计算
2006-07-13 22:28 2917问题的提出: 如果我们编译运行下面这个程序会看到什么? j ... -
工厂模式
2006-07-13 22:30 5135简单工厂模式 1. 目的 工厂模式就是专门负 ... -
61条面向对象设计的经验原则
2006-07-13 22:51 1854(1)所有数据都应该隐藏在所在的类的内部。 (2)类的使用者必 ... -
追MM与java的32种模式
2006-07-13 22:55 1838创建型模式 1、FACTORY—追MM少不了请吃饭了,麦当 ... -
OO的五大原则
2006-07-14 19:25 4756OO的五大原则是指SRP ... -
JAVA系列之对象的序列化与反序列化
2006-07-17 09:09 178291 简介 对象序列化(Seria ... -
java获取服务器端网卡地址
2006-08-08 19:43 4296java 代码 package com.ctgu ...
相关推荐
### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...
《C++ 设计新思维:范型编程与设计模式之应用》是一本深入探讨C++编程技巧和设计原则的专业书籍,旨在帮助读者掌握利用范型编程和设计模式提升软件开发效率和可维护性的方法。书中的内容丰富多样,涵盖了C++语言的...
### Genetic Programming范型编程 #### 一、引言与概览 遗传编程(Genetic Programming, GP)是一种基于自然选择原理的自动编程方法,它属于进化计算领域的一部分。该技术利用了生物进化的机制来自动地创建计算机...
Java 泛型是一种在编程中实现强类型检查和减少冗余类型转换的机制,它是在JDK 1.5版本中引入的。泛型的主要目标是提高代码的类型安全性、可读性和重用性,避免在运行时出现类型转换异常。 1. **泛型的基本概念** -...
Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和可读性。泛型允许我们在编写代码时指定容器(如List、Set、Map等集合...在实际编程中,我们应该尽可能地利用泛型来编写更安全、更清晰的代码。
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
《七周七语言:理解多种编程范型》这本书是一本编程领域的经典之作,旨在帮助读者在短时间内接触并理解多种不同的编程范型。编程范型是编程语言的核心思想和设计模式,理解它们对于提升编程能力至关重要。书中涵盖了...
《七周七语言:理解多种编程范型》是一本旨在帮助程序员深入了解不同编程范型的著作。这本书由Bruce A. Tate撰写,于2012年由人民邮电出版社出版。作者通过详细介绍七种不同的编程语言,揭示了每种语言的核心特性和...
在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...
另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java...
Java程序设计范型和枚举是Java编程中的关键概念,它们极大地增强了代码的类型安全性和重用性。本文将深入探讨这两个主题。 首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、...
Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...
这些范型定义了编程语言的基本结构和约束,影响着代码的编写方式以及解决问题的思路。本篇文章将深入探讨几种主要的程序设计语言范型,并提供一个概述。 1. **过程式编程**:这是最早期的编程范型,其核心思想是...
编程喜C#、Ruby、Haskell而厌Java。 白明 Neusoft某开发部技术总监,拥有多年电信级软件开发经验;资深C程序员,对Common Lisp、Python等小众语言也有涉猎;对开源软件有着浓厚的兴趣,曾先后贡献了lcut、cbehave等...
本文将对主流编程语言进行比较,包括 C、C++、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或C#,用来表示可以处理多种数据类型的代码。然而,在C语言中,我们没有内置的泛型机制。但是,通过巧妙地使用void指针和类型转换,我们可以模拟泛型栈的实现,使得同...