- 浏览: 109306 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
masuweng:
JAVA对数字证书的常用操作 -
beming:
org.springframework.beans.facto ...
利用Ant与Proguard混淆引用的子工程项目jar包及打war包 -
beming:
不错,挺清晰的
利用Ant与Proguard混淆引用的子工程项目jar包及打war包 -
sotired:
mark,看看
ExtJs2.0学习系列 - 索引贴
Java1.5 泛型指南中文版 (Java1.5 Generic Tutorial): http://blog.csdn.net/explorers/archive/2005/08/15/454837.aspx
英文版 pdf 下载链接: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
译者: chengchengji@163.com
目 录
4.1. 有限制的通配符 (Bounded Wildcards)
6.2. 擦除和翻译 (Erasure and Translation)
8. Class Literals as Run-time Type Tokens
摘要和关键字
generics 、 type safe 、 type parameter(variable) 、 formal type parameter 、 actual type parameter 、 wildcards(?) 、 unknown type 、 ? extends T 、 ? super T 、 erasure 、 translation 、 cast 、 instanceof 、 arrays 、 Class Literals as Run-time Type Tokens 、 wildcard capture 、 multiple bounds(T extends T1& T2 ... & Tn) 、 covariant returns
1. 介绍
JDK1.5 中引入了对 java 语言的多种扩展,泛型 (generics) 即其中之一。
这个教程的目标是向您介绍 java 的泛型 (generic) 。你可能熟悉其他语言的泛型,最著名的是 C++ 的模板 (templates) 。如果这样,你很快就会看到两者的相似之处和重要差异。如果你不熟悉相似的语法结构,那么更好,你可以从头开始而不需要忘记误解。
Generics 允许对类型进行抽象 (abstract over types) 。最常见的例子是集合类型 (Container types) , Collection 的类树中任意一个即是。
下面是那种典型用法:
List myIntList = new LinkedList(); // 1
myIntList.add( new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3
第 3 行的类型转换有些烦人。通常情况下,程序员知道一个特定的 list 里边放的是什么类型的数据。但是,这个类型转换是必须的 (essential) 。编译器只能保证 iterator 返回的是 Object 类型。为了保证对 Integer 类型变量赋值的类型安全,必须进行类型转换。
当然,这个类型转换不仅仅带来了混乱,它还可能产生一个运行时错误 (run time error) ,因为程序员可能会犯错。
程序员如何才能明确表示他们的意图,把一个 list 中的内容限制为一个特定的数据类型呢?这是 generics 背后的核心思想。这是上面程序片断的一个泛型版本 :
List<Integer> myIntList = new LinkedList<Integer>(); // 1
myIntList.add( new Integer(0)); // 2
Integer x = myIntList.iterator().next(); // 3
注意变量 myIntList 的类型声明。它指定这不是一个任意的 List ,而是一个 Integer 的 List ,写作: List<Integer> 。我们说 List 是一个带一个类型参数的泛型接口 (a generic interface that takes a type parameter) ,本例中,类型参数是 Integer 。我们在创建这个 List 对象的时候也指定了一个类型参数。
另一个需要注意的是第 3 行没了类型转换。
现在,你可能认为我们已经成功地去掉了程序里的混乱。我们用第 1 行的类型参数取代了第 3 行的类型转换。然而,这里还有个很大的不同。编译器现在能够在编译时检查程序的正确性。当我们说 myIntList 被声明为 List<Integer> 类型,这告诉我们无论何时何地使用 myIntList 变量,编译器保证其中的元素的正确的类型。与之相反,一个类型转换说明程序员认为在那个代码点上它应该是那种类型。
实际结果是,这可以增加可读性和稳定性 (robustness) ,尤其在大型的程序中。
2. 定义简单的泛型
下面是从 java.util 包中的 List 接口和 Iterator 接口的定义中摘录的片断:
public interface List<E> {
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E> {
E next();
boolean hasNext();
}
这些都应该是很熟悉的,除了尖括号中的部分,那是接口 List 和 Iterator 中的形式类型参数的声明 (the declarations of the formal type parameters of the interfaces List and Iterator) 。
类型参数在整个类的声明中可用,几乎是所有可是使用其他普通类型的地方 ( 但是有些重要的限制,请参考第 7 部分 ) 。
(原文: Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types (though there are some important restrictions; see section 7) )
在介绍那一节我们看到了对泛型类型声明 List(the generic type declaration List) 的调用,如 List<Integer> 。在这个调用中 ( 通常称作一个参数化类型 a parameterized type) ,所有出现形式类型参数 (formal type parameter, 这里是 E) 都被替换成实体类型参数 (actual type argument)( 这里是 Integer) 。
你可能想象 ,List<Integer> 代表一个 E 被全部替换成 Integer 的版本:
public interface IntegerList {
void add(Integer x)
Iterator<Integer> iterator();
}
这种直觉可能有帮助,但是也可能导致误解。
它有帮助,因为 List<Integer> 的声明确实有类似这种替换的方法。
它可能导致误解,因为泛型声明绝不会实际的被这样替换。没有代码的多个拷贝,源码中没有、二进制代码中也没有;磁盘中没有,内存中也没有。如果你是一个 C++ 程序员,你会理解这是和 C++ 模板的很大的区别。
一个泛型类型的声明只被编译一次,并且得到一个
class
文件,就像普通的
class
或者
interface
的声明一样。
发表评论
-
Java调用外部程序命令时线程阻塞问题分析
2012-01-06 13:52 1099文章参考http://www.q ... -
JVM(Java虚拟机)中进程工作目录讲解
2012-01-05 17:50 1545每次我们用Java命令运行我们的Java程序,都会在JVM中开 ... -
Fail Fast机制
2011-07-13 14:20 2491转自:http://geeklu.com/2010/07/fa ... -
在运行jar包中正确读取资源文件
2011-04-14 21:43 3039可能有不少初学者会有 ... -
java代码优化
2009-11-11 09:23 830Java程序中的内存管理机 ... -
java数组排序Arrays.sort,以及Comparator接口的用法
2010-02-03 12:18 829有的时候需要对数 ... -
HashMap,LinkedHashMap,TreeMap应用简介
2010-02-04 11:52 1044共同点: HashMap, ... -
javamail发送邮件的简单实例
2010-03-03 16:23 743今天学习了一下JavaMail ... -
java读写文件大全
2010-04-01 17:26 4注意:当你写文件的时候,为了提高效率,写入的数据会 ... -
[线程] Java线程完整学习索引贴
2010-04-20 15:09 0Java 线程是Java语言中一个非常重要的部分,Java ... -
Java 小例子:如何使用 Enum
2010-07-19 22:51 1595Java 在 1.5 以前,常量是个头疼的问题。因为一些参数只 ... -
DATE类学习总结(CALENDAR DATE 字符串 相互转换 格式化)
2010-12-06 16:20 904Date类学习总结(Calendar Date 字符串 相互转 ... -
设计模式解读 - 策略模式
2011-01-21 15:47 919设计模式解读 - 策略模式 1. 模式定义 ... -
Java中ThreadLocal的设计与使用
2011-01-22 00:48 800Java中ThreadLocal的设计与使用 早在Java 1 ... -
[转]代理模式 - 静态代理与动态代理
2011-01-22 01:07 9751. 代理模式主要有两种:静态代理和动态代理 2. 静态 ...
相关推荐
Java1.5泛型指南中文版(Java1.5 GenericTutorial)
Java 1.5 泛型指南中文版 本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、...
根据给定的信息,我们可以深入探讨Java 1.5中引入的泛型概念及其应用。...以上就是基于给定文件信息对Java 1.5泛型指南的主要知识点的详细介绍。希望这些信息能帮助读者更好地理解和应用Java中的泛型概念。
### Java 1.5 泛型指南中文版知识点解析 #### 1. 引言 在Java 1.5中引入的泛型是一种强大的类型安全机制,它允许开发者编写能够处理不同类型数据的类和方法,同时保持代码的类型安全性。通过使用泛型,开发者可以...
### Java 1.5 泛型指南:深入理解与应用 #### 一、引言:Java 1.5 泛型的重要性与背景 在Java 1.5版本中,引入了泛型(Generics)这一重要的特性,为类型安全性和代码重用性带来了革命性的改变。在此之前,开发...
Java泛型是自Java 1.5版本引入的一项重要特性,极大地提高了代码的类型安全性和重用性。本文将深入探讨Java泛型的概念、优点、使用方式及其在实际开发中的应用。 **一、泛型的基本概念** 泛型是Java语言中的一种...
本指南包含了一份Java 1.5泛型指南的中文版以及原始的英文教程,方便程序员进行对照学习。 **1. 泛型的概念** 泛型是一种在编写代码时指定类型参数的方式,允许开发者在定义类、接口和方法时声明类型约束。这使得...
JDK1.5泛型讲解 不错的东西 对jdk需要研究的朋友不妨看看 新手也来学习学习```
### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...
Java泛型是在JDK 1.5版本中引入的一项重要特性,极大地增强了类型安全性和代码可读性。泛型允许开发者在类、接口和方法中声明类型参数,从而实现对数据类型的抽象。在泛型的帮助下,开发者可以在编译时进行类型检查...