- 浏览: 3466111 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
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;
上面两行不会报错,因为编译器是一行一行的检查的,在编译阶段上面两行是没有关系的。第二行是原始类型给参数化类型。
发表评论
-
43 通过反射获得泛型的实际类型参数
2011-12-24 00:01 1944public static void applyV ... -
42 自定义泛型类的应用
2011-12-23 09:50 1643l 如果类的实例对 ... -
40 自定义泛型方法及其应用41 自定义泛型方法的练习与类型推断总结
2011-12-23 09:49 164940 自定义泛型方法及其应用 l <!--[e ... -
38 泛型的通配符扩展应用39 泛型集合的综合应用案例
2011-12-23 09:49 125938 泛型的通配符扩展应用 泛型中的?通配符: l问 ... -
33了解和入门注解的应用34 注解的定义与反射调用35为注解增加各种属性
2011-12-23 09:49 163833 了解和入门注解 ... -
32 使用BeanUtils工具包操作JavaBean
2011-12-22 10:02 1540Beanutils工具包: l 演示用eclipse ... -
30-31内省访问JavaBean属性的两种方法
2011-12-22 10:02 224630 对JavaBean的简单内省操作 //pt ... -
29 由内省引出JavaBean的讲解
2011-12-22 10:02 1401IntroSpector内省—> ... -
28 用类加载器的方式管理资源和配置文件
2011-12-22 10:01 1528/*getRealPath();//金山词霸/内部 ... -
27框架的概念及用反射技术开发框架的原理
2011-12-21 09:38 1145反射的作用à实现框架功能 *框架与框架要解决的 ... -
解释equals(),hashcode()和==
2011-12-21 09:38 1615简单的结论:当对象类没有不符合规范的override e ... -
26 ArrayList_HashSet的比较及Hashcode分析
2011-12-21 09:38 1655只有类的实例对象要被采用哈希算法进行存储和检索时,这个类 ... -
23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用
2011-12-21 09:37 128823对接收数组参数的成员方法进行反射 packa ... -
18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
2011-12-21 09:37 152618 理解反射的概念 反射 一、反射就是Java类中 ... -
17 透彻分析反射的基础_Class类
2011-12-20 11:16 1407Java类用于描述一类事物的共性,该类事物有什么属性,没 ... -
12-16 jdk5枚举
2011-12-20 10:55 1299模拟枚举,其实枚举编译后就是如此: pac ... -
11 jdk5基本数据类型的自动拆箱与装箱
2011-12-20 10:36 1633package cn.zyj11.revie ... -
09jdk5可变参数与OverLoad;10java5的增加for循环
2011-12-20 10:34 1380package cn.zyj0910.review ... -
08 jdk5的静态导入
2011-12-20 10:31 1231import语句可以导入一个类或某个包中的所有类 im ...
相关推荐
在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第23讲:泛型入门”中,我们将深入探讨C#中的一个重要特性——泛型。泛型是.NET Framework 2.0引入的关键功能,它极大地提高了代码的灵活性和...
"C# Web应用程序入门经典"是针对初学者的一份重要资源,它深入浅出地介绍了如何使用C#进行Web应用程序开发。在这个教程中,我们将探讨C#的基础知识,Web应用程序的架构,以及如何利用C#构建实际的Web应用。 首先,...
使用场景及目标:① 学习如何用 Rust 编写高效、内存安全和并发的应用程序;② 掌握 Rust 的基本语法和常用特性,为深入学习 Rust 打下基础。 其他说明:文中提供了多种实际操作的代码实例,建议动手实践以加深理解...
使用场景及目标:希望通过本文档快速上手并深入了解Kotlin的基本特性和进阶技巧,在实际项目尤其是安卓应用中运用自如。 其他说明:文档不仅提供了理论讲解,还包括了大量的示例代码和练习,确保学习者可以在实践中...
- **泛型(Generics)**:理解泛型的基本概念,学习如何定义泛型函数和泛型类,以实现代码重用性。 - **类型推断**:讨论TypeScript的类型推断机制,如何利用上下文类型提高代码编写效率。 #### 第三章:面向对象...
【C#课件】是针对初学者和有一定基础的学习者设计的一套全面的教程资源,旨在帮助用户从零开始掌握C#编程语言,直至能够熟练地应用在实际项目中。这套课件通过PPT的形式,以清晰易懂的方式呈现了C#的核心概念和技术...
《C#入门经典书—源码》是一本旨在帮助初学者快速掌握C#编程语言的书籍,其配套的源码提供了丰富的实践示例,让学习者能够...通过阅读和分析这些代码,学习者能更好地理解和应用C#的理论知识,从而成为熟练的C#开发者。
《C#入门经典(第七版)》是一本专为初学者和有经验的程序员设计的C#编程指南,旨在帮助读者快速掌握C#语言的核心概念和技术。这本书以其结构清晰、叙述明了的特点,赢得了广大读者的认可,无论是对于初次接触面向对象...
**ACM入门PPT指导及OJ题目推荐** 在计算机科学领域,ACM(Association for Computing Machinery)竞赛是一项享誉全球的编程比赛,旨在提升学生的算法设计和编程能力。本资源包针对初学者提供了全面的ACM入门指导,...
运行这些实例,观察结果,调试代码,你将对C#有更深的理解。 总结来说,“C#从入门到精通光盘例程”不仅涵盖了C#语言的全面知识,还提供了丰富的实践案例,是初学者和进阶者学习C#的理想资源。无论你是零基础的新手...
学习Swift3.0语言,可以从Swift语言快速入门v4.0.pdf这个文档入手,它通常会涵盖Swift的基本语法、控制流、数据类型、函数、类与结构体、枚举、协议、错误处理、泛型以及Swift3.0的新特性等全面内容。同时,可以结合...
3. **集合与泛型**:介绍ArrayList、LinkedList、Dictionary等集合类的使用,以及泛型的概念和应用。 4. **异常处理**:演示try-catch语句块的应用,以及如何自定义异常。 5. **文件与流操作**:讲解如何读写文件,...
《C# 2010入门经典》是一本专为初学者设计的编程教程,它详细介绍了Microsoft的C#编程语言在2010版本中的核心概念和实用技术。这本书以其深入浅出的讲解和丰富的实例,深受全球编程爱好者喜爱,被誉为“红皮书”。在...
《iPhone应用程序开发入门与实战源码》是一本旨在引导初学者进入iOS开发领域的书籍,它提供了丰富的源码实例,帮助读者深入理解iPhone应用的构建过程。这个压缩包包含的文件目录结构按照章节进行划分,方便读者按照...
2. **泛型**:介绍泛型的基本概念及其在集合框架中的应用。 3. **内部类与枚举**:阐述内部类的种类及枚举类型的使用场景。 4. **并发编程基础**:初步介绍Java并发编程的相关知识,包括线程的基本使用、同步机制等...
在入门阶段,读者将学习C#的基本语法,包括变量、数据类型、控制结构(如if语句、for循环、while循环)、函数、类和对象等概念。这些是构建任何C#程序的基础。同时,书中还会讲解如何使用Visual Studio 2005创建和...
- 泛型:掌握泛型的基本概念,了解泛型类、泛型方法和通配符。 10. **多线程** - 线程的创建:使用Thread类和实现Runnable接口创建线程。 - 线程同步:理解synchronized关键字,学习wait()、notify()和notifyAll...
C#是一种由微软公司开发的面向对象的编程语言,它被广泛应用于Windows应用程序、Web应用程序、游戏开发以及移动应用等领域。对于初学者来说,掌握C#的基础知识是至关重要的,因为这将为后续的深入学习和开发工作打下...
《C#从入门到精通》是一本旨在帮助初学者掌握C#编程语言的书籍,而提供的源码则是书中实例的实现代码。C#是一种由微软公司推出的面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,游戏制作,尤其是与...