`
啸笑天
  • 浏览: 3435024 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

36 入门泛型的基本应用37 泛型的内部原理及更深应用

 
阅读更多

 

36 入门泛型的基本应用

<!--[if !supportLists]-->l  <!--[endif]-->Jdk 1.5以前的集合类中存在什么问题

       ArrayList collection = new ArrayList();

       collection.add(1);

       collection.add(1L);

       collection.add("abc");

       int i = (Integer) collection.get(1);//编译要强制类型转换且运行时出错!

<!--[if !supportLists]-->l  <!--[endif]-->Jdk 1.5的集合类希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以外的数据

 

ArrayList<Integer> collection2 = new ArrayList<Integer>();
  collection2.add(1);
 /*collection2.add(1L);
 collection2.add(“abc”);*///这两行代码编译时就报告了语法错误
 int i2 = collection2.get(0);//不需要再进行类型转换

//new String(new StringBuffer("abc"));
Constructor<String> constructor1 =String.class.getConstructor(StringBuffer.class);
String str2 = constructor1.newInstance( new StringBuffer("abc"));
System.out.println(str2.charAt(2));  
 

 37 泛型的内部原理及更深应用

泛型是给编译器看的!!

<!--[if !supportLists]-->l  <!--[endif]-->泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。

代码:

/*
       泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,
       编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,
       getClass()方法的返回值和原始类型完全一样。
       */
      ArrayList<Integer> collection3 = new ArrayList<Integer>();
      ArrayList<String> collection2 = new ArrayList<String>();
      System.out.println(collection3.getClass() == collection2.getClass());
      /*
       由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,
       例如,用反射得到集合,再调用其add方法即可。
       */
      //collection3.add("abc");
      collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
      System.out.println(collection3.get(0));
 

 

l  ArrayList<E>类定义和ArrayList<Integer>类引用中涉及如下术语:

<!--[if !supportLists]-->Ø  <!--[endif]-->整个称为ArrayList<E>泛型类型

<!--[if !supportLists]-->Ø  <!--[endif]-->ArrayList<E>中的E称为类型变量或类型参数

<!--[if !supportLists]-->Ø  <!--[endif]-->整个ArrayList<Integer>称为参数化的类型

<!--[if !supportLists]-->Ø  <!--[endif]-->ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数

<!--[if !supportLists]-->Ø  <!--[endif]-->ArrayList<Integer>中的<>念着typeof

<!--[if !supportLists]-->Ø  <!--[endif]-->ArrayList称为原始类型

<!--[if !supportLists]-->l  <!--[endif]-->参数化类型与原始类型的兼容性:

<!--[if !supportLists]-->Ø  <!--[endif]-->参数化类型可以引用一个原始类型的对象,编译报告警告,例如,
Collection<String> c = new Vector();//
可不可以,不就是编译器一句话的事吗?//根据变量声明,说所以c中只能add字符串类型

<!--[if !supportLists]-->Ø  <!--[endif]-->原始类型可以引用一个参数化类型的对象,编译报告警告,例如,
Collection c = new Vector<String>();//
原来的方法接受一个集合参数,新的类型也要能传进去// c中可以add任何类型,即Object

<!--[if !supportLists]-->l  <!--[endif]-->参数化类型不考虑类型参数的继承关系:

<!--[if !supportLists]-->Ø  <!--[endif]-->Vector<String> v = new Vector<Object>(); //错误!///不写<Object>没错,写了就是明知故犯

<!--[if !supportLists]-->Ø  <!--[endif]-->Vector<Object> v = new Vector<String>(); //也错误!

<!--[if !supportLists]-->l  <!--[endif]-->编译器不允许创建泛型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句有错误:

      Vector<Integer> vectorList[] = new Vector<Integer>[10];

<!--[if !supportLists]-->l  <!--[endif]-->思考题:下面的代码会报错误吗?

Vector v1 = new Vector<String>();

Vector<Object> v = v1;

上面两行不会报错,因为编译器是一行一行的检查的,在编译阶段上面两行是没有关系的。第二行是原始类型给参数化类型。

 

 

分享到:
评论

相关推荐

    C# 2.0中泛型编程初级入门教程.pdf

    本文讨论泛型使用的一般问题,比如为什么要使用泛型、泛型的编写方法、泛型中数据类型的约束、泛型 中静态成员使用要注意的问题、泛型中方法重载的问、泛型方法等,通过这些...读完本篇文章,你会对泛型有更深的了解。

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 编辑推荐 Java编程老鸟...

    Kotlin 实战 (kotlin in action) 电子书

    Kotlin 实战中文版电子书 (《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 ...

    Kotlin in action

    《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括...

    kotlin 实战

    《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 编辑推荐 Java编程老鸟...

    朱老师C++课程第3部分3.3.STL的泛型算法使用详解

    《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续深度...本教程只是入门

    asp.net知识库

    .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 ...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用组件 42 2.2.2 ...

    朱老师C++课程第3部分3.1-C++模板编程入门

    《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续...本教程只是入门篇,后

    朱老师C++课程第3部分3.4.模板特化与类型萃取

    《朱老师带你学C++》属于系列课程《朱有鹏老师热门编程语言全解》的第一部分,主要针对C++语言学习。本课程可以看做是嵌入式linux核心课程中《C语言专题》课程的延续,在学好了C语言前提下继续深度...本教程只是入门

Global site tag (gtag.js) - Google Analytics