泛型
2016-04-07 11:15
190 查看
泛型简述
可以简单地将泛型理解为参数化类型。
通过使用泛型,可以创建以类型安全的方式使用各种类型数据的类、接口和方法。许多算法虽然操作数据类型不同,但算法逻辑相同。例如,不管堆栈存储的数据类型是Integer、String、Object还是Thread,支持堆栈的机制是相同的。使用泛型,可以 只定义一次算法,使其独立特定的数据类型,然后将算法应用于各种数据类型而不需要做任何额外工作。
泛型机制能告知编译器每个集合中接受哪些对象类型,执行类型检查,自动对插入对象进行类型转换,并在编译时告知是否插入了类型错误的对象,这样程序既安全又清晰。
在没有泛型前,创建一般化的类、接口和方法可以通过操作Object类型的引用来操作各种类型的对象,因为Object是所有其他类的超类,所以Object引用变量可以引用所有类型的对象。但是它们没办法以类型安全的方式进行工作,当从集合中读取到每一个对象时都要进行类型转换。
泛型提供了类型安全性,简化了处理过程。使用泛型,所有类型都是自动和隐式进行的,无需在Object和实践操作的数据类型之间进行转换。泛型扩展了重用代码的能力,并且可以安全、容易地 重用代码。
泛型类和接口
声明中具有一个或者多个类型参数的类或者接口。类型参数(类型变量)由尖括号界定,放在类或接口后面,interface List< T>、class TestGen< K,V>,这里的T、K、V不是值,而是类型。如List< String>是一个参数化的类型,表示元素类型为String的列表。(String是与形式类型参数E相对应的实际类型参数。)
每个泛型都定义一个原生态类型(raw type),即不带任何类型参数的泛型名称。如与List< E>相对应的原生态类型是List。原生态类型List与Java平台没有泛型之前的接口类型List完全一样,使用时是用实际类型参数替换掉形式类型参数E。
对于泛型类(含集合类):
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型
类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化
把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想。
泛型方法
泛型和继承的关系
通配符
代码示例
有限制通配符
可以简单地将泛型理解为参数化类型。
通过使用泛型,可以创建以类型安全的方式使用各种类型数据的类、接口和方法。许多算法虽然操作数据类型不同,但算法逻辑相同。例如,不管堆栈存储的数据类型是Integer、String、Object还是Thread,支持堆栈的机制是相同的。使用泛型,可以 只定义一次算法,使其独立特定的数据类型,然后将算法应用于各种数据类型而不需要做任何额外工作。
泛型机制能告知编译器每个集合中接受哪些对象类型,执行类型检查,自动对插入对象进行类型转换,并在编译时告知是否插入了类型错误的对象,这样程序既安全又清晰。
在没有泛型前,创建一般化的类、接口和方法可以通过操作Object类型的引用来操作各种类型的对象,因为Object是所有其他类的超类,所以Object引用变量可以引用所有类型的对象。但是它们没办法以类型安全的方式进行工作,当从集合中读取到每一个对象时都要进行类型转换。
泛型提供了类型安全性,简化了处理过程。使用泛型,所有类型都是自动和隐式进行的,无需在Object和实践操作的数据类型之间进行转换。泛型扩展了重用代码的能力,并且可以安全、容易地 重用代码。
泛型类和接口
声明中具有一个或者多个类型参数的类或者接口。类型参数(类型变量)由尖括号界定,放在类或接口后面,interface List< T>、class TestGen< K,V>,这里的T、K、V不是值,而是类型。如List< String>是一个参数化的类型,表示元素类型为String的列表。(String是与形式类型参数E相对应的实际类型参数。)
每个泛型都定义一个原生态类型(raw type),即不带任何类型参数的泛型名称。如与List< E>相对应的原生态类型是List。原生态类型List与Java平台没有泛型之前的接口类型List完全一样,使用时是用实际类型参数替换掉形式类型参数E。
对于泛型类(含集合类):
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型
类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化
把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想。
泛型方法
泛型和继承的关系
通配符
代码示例
public static void main(String[] args) { List<?> list = null; list = new ArrayList<String>(); list = new ArrayList<Double>(); //list.add(3); list.add(null); List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); l1.add(“阿法园"); l2.add(15); read(l1); read(l2); } static void read(List<?> list){ for(Object o : list){ System.out.println(o); } }
有限制通配符
public static void printCollection3(Collection<? extends Person> coll){ //Iterator只能用Iterator<?>或Iterator<? extends Person>.why? Iterator<?> iterator = coll.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } public static void printCollection4(Collection<? super Person> coll){ Iterator<?> iterator = coll.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
相关文章推荐
- tomcat域名配置
- 5.1.3 SMTPD_CMD smtpd_cmd_table[]数组:回调函数数组
- Android eclipse工程导入Android studio注意事项
- Linux内核中链表的实现与应用【转】
- C#引用类库时出现黄色三角加感叹号的处理
- select、poll、epoll之间的区别总结[整理]
- nw.js node-webkit系列(20)拖动文件到页面并读取文件信息
- postgres error : failed to read kind from backend
- OpenCV Haar AdaBoost源码改进(比EMCV快6倍)
- 民间称谓大全
- web项目上云的思考
- RabbitMQ消息队列(五):Routing 消息路由
- android自定义view-打造圆形ImageView(三)
- socket编程——一个简单的例子
- SAX解析XML文件
- javaWeb项目中mysql的NULL和空之争
- 5.1.2 SMTPD_CMD结构体:smtp协议命令表示
- c++实验3-个人所得税计算器
- intent://platformapi/startapp?--Webview内跳转到支付宝网页
- FZU 2027 单词问题 map标记字符串典型问题