`
啸笑天
  • 浏览: 3460170 次
  • 性别: 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;

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

 

 

分享到:
评论

相关推荐

    VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第23讲:泛型入门

    在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第23讲:泛型入门”中,我们将深入探讨C#中的一个重要特性——泛型。泛型是.NET Framework 2.0引入的关键功能,它极大地提高了代码的灵活性和...

    c#web应用程序入门经典

    "C# Web应用程序入门经典"是针对初学者的一份重要资源,它深入浅出地介绍了如何使用C#进行Web应用程序开发。在这个教程中,我们将探讨C#的基础知识,Web应用程序的架构,以及如何利用C#构建实际的Web应用。 首先,...

    (完结14章)TS 从入门到深度掌握,晋级TypeScript高手

    - **泛型(Generics)**:理解泛型的基本概念,学习如何定义泛型函数和泛型类,以实现代码重用性。 - **类型推断**:讨论TypeScript的类型推断机制,如何利用上下文类型提高代码编写效率。 #### 第三章:面向对象...

    C#课件,讲解C#的入门到应用,可以作为教学课件

    【C#课件】是针对初学者和有一定基础的学习者设计的一套全面的教程资源,旨在帮助用户从零开始掌握C#编程语言,直至能够熟练地应用在实际项目中。这套课件通过PPT的形式,以清晰易懂的方式呈现了C#的核心概念和技术...

    c#入门经典书—源码

    《C#入门经典书—源码》是一本旨在帮助初学者快速掌握C#编程语言的书籍,其配套的源码提供了丰富的实践示例,让学习者能够...通过阅读和分析这些代码,学习者能更好地理解和应用C#的理论知识,从而成为熟练的C#开发者。

    C#入门经典(第七版)

    《C#入门经典(第七版)》是一本专为初学者和有经验的程序员设计的C#编程指南,旨在帮助读者快速掌握C#语言的核心概念和技术。这本书以其结构清晰、叙述明了的特点,赢得了广大读者的认可,无论是对于初次接触面向对象...

    ACM入门PPT指导及OJ题目推荐

    **ACM入门PPT指导及OJ题目推荐** 在计算机科学领域,ACM(Association for Computing Machinery)竞赛是一项享誉全球的编程比赛,旨在提升学生的算法设计和编程能力。本资源包针对初学者提供了全面的ACM入门指导,...

    C#从入门到精通光盘例程

    运行这些实例,观察结果,调试代码,你将对C#有更深的理解。 总结来说,“C#从入门到精通光盘例程”不仅涵盖了C#语言的全面知识,还提供了丰富的实践案例,是初学者和进阶者学习C#的理想资源。无论你是零基础的新手...

    Swift3.0语言快速入门

    学习Swift3.0语言,可以从Swift语言快速入门v4.0.pdf这个文档入手,它通常会涵盖Swift的基本语法、控制流、数据类型、函数、类与结构体、枚举、协议、错误处理、泛型以及Swift3.0的新特性等全面内容。同时,可以结合...

    C#入门经典(第5版)随书源代码

    3. **集合与泛型**:介绍ArrayList、LinkedList、Dictionary等集合类的使用,以及泛型的概念和应用。 4. **异常处理**:演示try-catch语句块的应用,以及如何自定义异常。 5. **文件与流操作**:讲解如何读写文件,...

    C#2010入门经典beginning c# 2010(英文版+源代码)

    《C# 2010入门经典》是一本专为初学者设计的编程教程,它详细介绍了Microsoft的C#编程语言在2010版本中的核心概念和实用技术。这本书以其深入浅出的讲解和丰富的实例,深受全球编程爱好者喜爱,被誉为“红皮书”。在...

    iphone应用程序开发入门与实战源码

    《iPhone应用程序开发入门与实战源码》是一本旨在引导初学者进入iOS开发领域的书籍,它提供了丰富的源码实例,帮助读者深入理解iPhone应用的构建过程。这个压缩包包含的文件目录结构按照章节进行划分,方便读者按照...

    Java入门与实例教程

    2. **泛型**:介绍泛型的基本概念及其在集合框架中的应用。 3. **内部类与枚举**:阐述内部类的种类及枚举类型的使用场景。 4. **并发编程基础**:初步介绍Java并发编程的相关知识,包括线程的基本使用、同步机制等...

    visual C#2005从入门到精通 周靖 译

    在入门阶段,读者将学习C#的基本语法,包括变量、数据类型、控制结构(如if语句、for循环、while循环)、函数、类和对象等概念。这些是构建任何C#程序的基础。同时,书中还会讲解如何使用Visual Studio 2005创建和...

    Java入门练习50题

    - 泛型:掌握泛型的基本概念,了解泛型类、泛型方法和通配符。 10. **多线程** - 线程的创建:使用Thread类和实现Runnable接口创建线程。 - 线程同步:理解synchronized关键字,学习wait()、notify()和notifyAll...

    C#基础入门ppt文档

    C#是一种由微软公司开发的面向对象的编程语言,它被广泛应用于Windows应用程序、Web应用程序、游戏开发以及移动应用等领域。对于初学者来说,掌握C#的基础知识是至关重要的,因为这将为后续的深入学习和开发工作打下...

    C#从入门到精通书源码

    《C#从入门到精通》是一本旨在帮助初学者掌握C#编程语言的书籍,而提供的源码则是书中实例的实现代码。C#是一种由微软公司推出的面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,游戏制作,尤其是与...

    visual c#2010 从入门到精通

    书名中提到的"从入门到精通"意味着它覆盖了从最基础的概念开始,逐步深入到更高级的技术层面,让读者能够循序渐进地学习和掌握C#编程。这样的书籍通常包括但不限于以下几个方面的内容: 1. C#基础语法:包括变量、...

    C++零基础入门学习视频课程.txt打包整理.zip

    通过编写小程序、解决实际问题,你会对C++有更深的理解,并逐渐提升编程技能。"赚钱项目"这样的主题可能意味着课程中会包含一些实际应用的示例,比如创建一个小游戏或简单的商业应用,这些都是将理论知识转化为实际...

Global site tag (gtag.js) - Google Analytics