`
xuehongliang
  • 浏览: 94980 次
  • 性别: Icon_minigender_1
  • 来自: 辽宁
社区版块
存档分类
最新评论

JDK5.0新特性的学习--泛型(上)

    博客分类:
  • java
阅读更多

没有泛型的日子
     所有的java类都源自java.lang.Object,这意味着所有的JAVA对象能转换成Object。因此,在之前的JDK的版本中,很多集合框架的函数接受一个Object参数。所以,collections是一个能持有任何对象的多用途工具,但带来了不良的后果。

     举个简单的例子,在JDK 5.0的之前版本中,类List的函数add接受一个Object参数:

  1. public boolean add(java.lang.Object element)  


        所以你能传递任何类型给add。这是故意这么设计的。否则,它只能传递某种特定的对象,这样就会出现各种List类型,如,StringList, EmployeeList, AddressList等。
     add通过Object传递能带来好处,现在我们考虑get函数(返回List中的一个元素).如下是JDK 5之前版本的定义:

  1. public java.lang.Object get(int index) throws IndexOutOfBoundsException  

get返回一个Object.不幸的事情从此开始了.假如你储存了两个String对象在一个List中:

  1. List stringList1 = new ArrayList();   
  2. stringList1.add("Java 5");   
  3. stringList1.add("with generics");  

当你想从stringList1取得一个元素时,你得到了一个Object.为了操作原来的类型元素,你不得不把它转换为String。

  1. String s1 = (String) stringList1.get(0);  

但是,假如你曾经把一个非String对象加入stringList1中,上面的代码会抛出一个ClassCastException. 有了泛型,你能创建一个单一用途的List实例.比如,你能创建一个只接受String对象的List实例,另外一个实例只能接受Employee对象.这同样适用于集合框架中的其他类型.

泛型入门

   像一个函数能接受参数一样,一个泛型也能接受参数.这就是一个泛型经常被称为一个参数化类型的原因.但是不像函数用()传递参数,泛型是用<>传递参数的.声明一个泛型和声明一个普通类没有什么区别,只不过你把泛型的变量放在<>中.
     比如,在JDK 5中,你可以这样声明一个java.util.List :  List<e></e> myList;
E 称为类型变量.意味着一个变量将被一个类型替代.替代类型变量的值将被当作参数或返回类型.对于List接口来说,当一个实例被创建以后,E 将被当作一个add或别的函数的参数.E 也会使get或别的参数的返回值.下面是add和get的定义:

  1. boolean add E get(int index)  

一个泛型在声明或例示时允许你传递特定的类型变量: E.除此之外,如果E是个类,你可以传递子类;如果E是个接口,你可以传递实现接口的类;

  1. List numberList= new ArrayList();   
  2.    numberList.add(2.0);   
  3.    numberList.add(2);  

-----------------------------译者添加--------------------

那么mylist的add函数将接受一个String作为他的参数,而get函数将返回一个String.因为返回了一个特定的类型,所以不用类型转化了。

根据惯例,我们使用一个唯一的大写字目表示一个类型变量。为了创建一个泛型,你需在声明时传递同样的参数列表。比如,你要想创建一个ArrayList来操作String ,你必须把String放在<>中。如:

  1. List myList = new ArrayList();  

再比如,java.util.Map 是这么定义的:

public interface Map

K用来声明map键(KEY)的类型而V用来表示值(VALUE)的类型。put和values是这么定义的:

V put(K key, V value)
Collection<v></v> values()

一个泛型不准直接的或间接的是java.lang.Throwable的子类。因为异常是在运行时抛出的,所以它不可能预言什么类型的异常将在编译时抛出.

列表1的例子将比较List在JDK 1.4 和JDK1.5的不同

  1. public class GenericListTest {   
  2.   public static void main(String[] args) {   
  3.     // in JDK 1.4   
  4.     List stringList1 = new ArrayList();   
  5.     stringList1.add("Java 1.0 - 5.0");   
  6.     stringList1.add("without generics");   
  7.     // cast to java.lang.String   
  8.     String s1 = (String) stringList1.get(0);   
  9.     System.out.println(s1.toUpperCase());   
  10.   
  11.     // now with generics in JDK 5   
  12.     List stringList2 = new ArrayList();   
  13.     stringList2.add("Java 5.0");   
  14.     stringList2.add("with generics");   
  15.     // no need for type casting   
  16.     String s2 = stringList2.get(0);   
  17.     System.out.println(s2.toUpperCase());   
  18.   }   
  19. }  

在列表1中,stringList2是个泛型。声明List<string></string>告诉编译器List的实例能接受一个String对象。当然,在另外的情况中,你能新建能接受各种对象的List实例。注意,当从List实例中返回成员元素时,不需要对象转化,因为他返回的了你想要的类型,也就是String.

泛型的类型检查(type checking)是在编译时完成的.

      最让人感兴趣的事情是,一个泛型是个类型并且能被当作一个类型变量。比如,你想你的List储存lists of Strings,你能通过把List<string></string>作为他的类型变量来声明List。比如:

  1. List<List<String>> myListOfListsOfStrings;  

要从myList中的第一个List重新取得String,你可以这么用:

  1. String s = myListOfListsOfStrings.get(0).get(0);  

下一个列表中的ListOfListsTest类示范了一个List(命名为listOfLists)接受一个String List作为参数。

  1. public class ListOfListsTest {   
  2.   public static void main(String[] args) {   
  3.     List listOfStrings = new ArrayList();   
  4.     listOfStrings.add("Hello again");   
  5.     List> listOfLists = new ArrayList>();   
  6.     listOfLists.add(listOfStrings);   
  7.     String s = listOfLists.get(0).get(0);   
  8.     System.out.println(s); // prints "Hello again"   
  9.   }   
  10. }  


另外,一个泛型接受一个或多个类型变量。比如,java.util.Map有两个类型变量s。第一个定义了键(key)的类型,第二个定义了值(value)的类型。下面的例子讲教我们如何使用个一个泛型Map.

  1. public class MapTest {   
  2.   public static void main(String[] args) {   
  3.     Map map = new HashMap();   
  4.     map.put("key1""value1");   
  5.     map.put("key2""value2");   
  6.     String value1 = map.get("key1");   
  7.   }   
  8. }  


在这个例子中,重新得到一个key1代表的String值,我们不需要任何类型转换。



-----------------------------译者添加--------------------

如果你传递一个String给一个List,比如:

List<string></string> myList;

分享到:
评论
2 楼 ueseu 2007-04-24  
建议把<
替换为&amp;lt;
把>替换为&amp;gt;
1 楼 ueseu 2007-04-24  
强烈建议把上面的标签修正一下

List<String>变成List
代码里是<string></string>

建议把<
替换为&lt;
把>替换为&gt;

相关推荐

    JDK5.0_下载-安装-配置

    总结来说,JDK5.0是Java发展中的关键版本,引入了泛型、枚举、自动装箱/拆箱等新特性,极大地简化了编码。正确下载、安装并配置JDK5.0后,就可以开始愉快的Java编程之旅,而"HelloWorld"则是学习任何编程语言的第一...

    JDK 5.0.zip

    2. **泛型(Generics)**:泛型是JDK 5.0最重要的特性之一,允许在类、接口和集合中定义类型参数,提高了代码的重用性,减少了类型转换的错误,增强了编译时的类型检查。 3. **自动装箱与拆箱**:JDK 5.0中,原始...

    jdk5.0新特性实例讲解

    Java JDK 5.0,又称为JDK 1.5,是Java开发工具包的一个重要升级,它引入了大量的新特性和改进,极大地提升了Java编程的...而"jdk5.0新特征.txt"则可能包含了对所有新特性的详细描述和使用示例,是深入学习的好资源。

    jdk5.0新特性汇总(超级详细)

    ### JDK 5.0 新特性详解 #### 一、增强的 for 循环(ForEach Loop) JDK 5.0 引入了增强的 `for` 循环,也称为 foreach 循环,用于简化对集合和数组的操作。这种循环语法更加简洁,易于阅读。 **示例代码:** ``...

    JDK5.0新特性

    以上就是JDK 5.0中的一些重要新特性,这些特性极大地推动了Java语言的发展,使其在软件开发领域保持了强大的竞争力。通过学习和掌握这些特性,开发者可以编写出更加高效、健壮和易于维护的代码。

    良葛格JDK5.0学习笔记

    通过深入学习《良葛格JDK5.0学习笔记》,开发者能够全面了解并熟练运用这些新特性,提升代码质量和效率,更好地适应Java编程的新时代。这份笔记对于Java初学者和有一定经验的开发者来说都是一份宝贵的参考资料。

    2.JDK5.0新特性.doc

    泛型是JDK 5.0引入的一项重大新特性,极大地提高了Java编程的类型安全性和效率。泛型允许我们在定义类、接口和方法时使用类型参数,而不是具体的类型,这样在编译期间就能进行类型检查,防止了运行时可能出现的...

    良葛格Java JDK 5.0学习笔记

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。这里,我们将详细探讨这个版本的关键知识点,帮助初学者更好地理解和掌握Java编程。 1. **自动类型推断(var...

    良葛格Java JDK 5.0学习笔记[可打印]

    Java JDK 5.0是Java开发的一个里程碑版本,它引入了许多重要的新特性和改进,极大地提升了开发效率和代码质量。良葛格的Java JDK 5.0学习笔记是一份宝贵的资源,适合初学者和有经验的开发者回顾这个版本的关键概念。...

    jdk5.0新特性ppt

    泛型是JDK 5.0中最关键的特性之一,它允许我们在类、接口和方法中使用类型参数,从而在编译时就能检查类型安全。泛型帮助我们避免了运行时的`ClassCastException`,因为它们确保了集合和容器中存储的数据类型与预期...

    JDK5.0新特性源代码

    在这个名为“JDK5.0新特性源代码”的压缩包中,我们可以期待找到与这些关键特性相关的源代码示例。以下是JDK 5.0引入的一些核心新特性及其详细解释: 1. **泛型(Generics)**:泛型允许在类、接口和方法中声明类型...

    (Java 2 SDK)JDK 5.0 的源代码

    以上就是JDK 5.0中的一些关键特性,这些源代码的分析有助于深入理解Java平台的工作原理,对于学习和优化Java代码具有重要的价值。通过阅读和研究这些源文件,开发者可以更好地掌握Java编程的精髓,提升自己的编程...

    JDK5.0的11个主要新特征

    JDK5.0是Java开发的一个重要里程碑,它引入了11个主要的新特性,极大地提升了编程效率和代码安全性。以下是对这些特性的详细说明: 1. 泛型(Generic) 泛型的引入是为了解决类型安全问题,避免在运行时进行不必要...

    jdk-6u39-windows-x64-demos.zip

    JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛...从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。

    jdk 5.0 ban

    Java Development Kit..."rumenjingdianjdk"这个文件可能是某个教程或示例代码,用于帮助学习和理解JDK 5.0中的新特性和用法。对于初学者来说,通过实践这些示例,可以更好地掌握JDK 5.0的更新内容,提升编程技能。

    良葛格Java JDK 5.0学习笔记ch05

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。在这个"良葛格Java JDK 5.0学习笔记ch05"中,我们将深入探讨其中的关键知识点。 一、泛型 Java 5.0引入了...

    JDK 5.0中的泛型类型学习

    JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...

    jdk1.6 64位 官方正式版 jdk-6u45-windows-x64

    下载后解压运行。JDK Java Development Kit是SunMicrosystems针对Java开发员的产品。...从SUN的JDK5.0开始提供了泛型等非常实用的功能,其版本也不断更新,此次提供的jdk1.6运行效率得到了非常大的提高。

    JDK 5.0中文版API

    JDK 5.0是一个重要的里程碑,它引入了许多创新特性,极大地提升了Java的效率和可维护性。这篇文档将详细解析JDK 5.0中文版API,帮助初学者和有经验的开发者更好地理解和利用这一强大的资源。 ### 类库概述 JDK 5.0...

Global site tag (gtag.js) - Google Analytics