黑马程序员 JAVA__高新技术--泛型总结
来源:互联网 发布:雷电抢购软件 编辑:程序博客网 时间:2024/05/12 21:17
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
泛型:
JDK1.5出现的安全机制。是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器、编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。
由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据。
例如,用反射得到集合,再调用其add方法即可。
-----------------------------------------------------------------------------------------------------------------------------------------------------
泛型中涉及的术语:
整个ArrayList<E>称为:泛型类型
ArrayList<E>中的E称为:类型变量或类型参数
整个ArrayList<Integer>称为:参数化的类型
ArrayList<Integer>中的Integer称为:类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念着typeof
ArrayList称为:原始类型
-----------------------------------------------------------------------------------------------------------------------------------------------------
泛型的好处:
1.将运行时期的问题,ClassCastException转到了编译时期。
2.避免了强制转换的麻烦。
-----------------------------------------------------------------------------------------------------------------------------------------------------
<>:什么时候用呢?
当操作的引用数据类型不确定的时候,就使用<>。将要操作的引用数据类型传入即可。其实<>就是一个用于接收具体引用数据类型的参数范围。
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。
-----------------------------------------------------------------------------------------------------------------------------------------------------
泛型的擦除和补偿:
泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。
泛型的擦除:运行时,会将泛型去掉,生成的class文件中是不带泛型的。
为什么擦除呢?为了兼容运行的类加载器。
泛型的补偿:在运行时,通过获取元素的类型进行转换动作,不用使用者再强制转换了。
注意:泛型内只能定义引用数据类型,不能定义基本数据类型。
-----------------------------------------------------------------------------------------------------------------------------------------------------
泛型的通配符和泛型的限定:
? 未知类型。
泛型的限定:
? extends Person 接收Person类型或者Person的子类对象。上限。一般在存储元素的时候使用
? super Person 接收Person类型或者Person的父类对象。下限。通常对集合中的元素进行去除操作时使用。
通配符中需要注意的问题
定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?
错误方式:
public static void printCollection(Collection<Object> cols) {for(Object obj:cols) {System.out.println(obj);}/* cols.add("string");//没错 cols = new HashSet<Date>();//错误!*/}正确方式:
public static void printCollection(Collection<?> cols) {for(Object obj:cols) {System.out.println(obj);}//cols.add("string");//错误,因为它不知自己未来匹配就一定是Stringcols.size();//没错,此方法与类型参数没有关系cols = new HashSet<Date>();}
总结:
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
---------------------------------------------------------------------------------------------------------------------------------------------------
泛型中需要注意的知识点:
参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector();//为了兼容之前的程序
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>(); //错误
Vector<Object> v = new Vector<String>(); //错误!
在创建数组实例时,数组的元素不能使用参数化的类型:
例如,下面语句有错误:
Vector<Integer>[] vectorList = new Vector<Integer>[10];
---------------------------------------------------------------------------------------------------------------------------------------------------
自定义泛型方法:
交换数组中的两个元素的位置的泛型方法语法定义如下:
static <E> void swap(E[] a, int i, int j) {E t = a[i];a[i] = a[j];a[j] = t;}
注意:只有引用类型才能作为泛型方法的实际参数,E代表的是引用数据类型,E[]a就是引用数据类型的数组。swap(new int[3],3,5);语句会报告编译错误。
---------------------------------------------------------------------------------------------------------------------------------------------------
自定义泛型类:
如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型,语法格式如下:
public class GenericDao<T> {private T field1;public void save(T obj){}public T getById(int id){}}
注意:当方法静态时,不能访问类上定义的泛型,如果静态方法使用泛型,只能将泛型定义在方法上。
---------------------------------------------------------------------------------------------------------------------------------------------------
代码示例:
class Tool<T> {private T t;public T getObject() {return t;}public void setObject(T obj) {this.t = obj;}public <W> void show(W str){//泛型定义在方法上。System.out.println("show : "+str);}public void print(T str){System.out.println("println : "+str);}public static <Y> void method(Y str){//泛型必须放在返回值前面System.out.println("println : "+str);}}public class GenericDemo2 {public static void main(String[] args) {Tool<String> tool = new Tool<String>();//tool.setObject(new String("abc"));//String str = /*(String)*/tool.getObject();tool.show("abc");tool.print("haha");//编译通过tool.print(new Integer(4));//编译失败,只能传String类型tool.method(new Integer(4));}}
---------------------------------------------------------------------------------------------------------------------------------------------------
泛型接口。将泛型定义在接口上。
interface Inter<T>{public void show(T t);}class InterImpl2<Q> implements Inter<Q>{public void show(Q q){System.out.println("show:::"+q);}}class InterImpl implements Inter<String>{public void show(String str){System.out.println("show:::"+str);}}public class GenericDemo3 {public static void main(String[] args) {InterImpl in = new InterImpl();in.show("str");InterImpl2 in2 = new InterImpl2();in2.show(new Integer(4));}}
-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员 JAVA__高新技术--泛型总结
- 黑马程序员---高新技术总结
- 黑马程序员Java__泛型
- 黑马程序员Java__代理
- 黑马程序员Java__基础
- 黑马程序员Java__多线程
- 黑马程序员_高新技术总结
- 黑马程序员---java高新技术之泛型
- 黑马程序员 java高新技术之泛型
- 黑马程序员---高新技术之泛型
- 黑马程序员Java__增强注释
- 黑马程序员Java__银行调度
- 黑马程序员Java__网络编程
- 黑马程序员Java__正则表达式
- 黑马程序员-Java基础总结16——高新技术Day02(JavaBean、注解与泛型)
- 黑马程序员---Java高新技术上的总结
- 黑马程序员__JAVA高新技术--反射、注解总结
- 黑马程序员 Java高新技术 反射总结
- Windows下usb接口驱动技术(二)
- An introduction to C++ Traits
- IOS 自定义导航栏背景
- FastReport.Net教程大全
- IOS 单例
- 黑马程序员 JAVA__高新技术--泛型总结
- AUTOSAR
- UVA 11538 Chess Queen
- 【图文并茂】人人都会修改APK,美化,汉化,去广告
- VC 设置系统时间
- mongodb简单查询
- 百度地图离线API及地图数据下载工具-尝鲜篇
- Xcode运行时错误:Could not launch "*.app"--No such file or directory(Users/*/Library/...)
- C++和C的源码混合使用需要了解的事