JAVA基础加强_高新技术_收获五

时间:2022-08-02 19:42:52


JAVA基础加强_高新技术_收获五

java 高级视频教程_网络编程 36.avi-40.avi

入门泛型的基本应用:
JDK1.5新特性——泛型也是一种。
使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且从集合获取一个对象是,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,使用更方便。

用到泛型的一些情况:集合、反射

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

ArrayList<String> arrList1 = new ArrayList<String>();
ArrayList<Integer> arrList2 = new ArrayList<Integer>();
System.out.println(arrList1.getClass() == arrList2.getClass());
结果为true
经过编译后arrList1与arrList2用.getClass()获取字节码是相同的。
用反射为其arrList2 加String类型的数据
arrList2.getClass().getMethod("add",Object.class).invoke(arrList2,"abc");
System.out.println(arrList2.get(1));
可以打印出对应位置的"abc"

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

泛型的一些术语:

整个成为ArrayList<E> 泛型类型
ArrayList<E>中的E成为类型变量或类型参数
整个ArrayList<Intger> 成为参数化类型
ArrayList<Intger>中的Intger成为类型参数的实例或实际类型参数
ArrayList<Intger>中的<>念着typeof
ArrayList成为原始类型

参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象
Collection<String> c = new Vector();
原始类型可以引用一个参数化类型的对象
Collection c = new Vector<String>();

参数化类型不考虑类型参数的继承关系:
Vector<String> v =new Vector<Object>(); //错误!不写<Object>没错,写了就是明知故犯。
Vector<Object> v =new Vector<String>(); //也错误!

在创建数组实例时,数组的元素不能使用参数化的类型,例如:
Vector<Integer> vectorList[] = new Vector<Integer>[10];

泛型的通配符扩展应用:

泛型中的?通配符:

使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数有关的方法。

泛型中的?通配符的扩展:
限定通配符的上边界:
extends表示仅限于Number或限于Number的子类。
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界:
super表示仅限于Integer的父类,限定下边界,最低往下也必须是Integer。
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();


泛型集合的综合应用案例:

Java的结合主要分为两大类,即Collection类型的集合和Map类型的集合
1、Collection类型的集合是单列的,其中增加的每个元素都为一个单独的对象。
2、Map类型的集合是双列的,其中增加的每个元素都包括有两个对象,一个用作键,另外一个用作值,即Map类型的集合中的每一个元素为一个键对象和值对象的组合体,Map集合的最重要特点就是可以从Map集合中检索出一个对象对应的值对象,有点类似英汉词典对照表功能。

java系统类库中定义了一个Collection接口来描述Collection类型的集合对外提供的操作,定义了一个Map接口来描述Mao类型的集合对外提供操作,另外,Java系统类库中也提供了Collection接口和Map接口的多个实现类,这些实现类内部采用不同的存储策略和数据结构来存储集合中的各个元素。


自定义泛型方法及其应用:

定义泛型的方法:


用于放置泛型类型的参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前。按照惯例,类型参数通常用单个大写字母表示。
只有引用类型才能作为泛型类型的参数,不能为基本类型。

除了在用用反省是可以使用extends限定符,在定义反省是也可以使用extends限定符。
例如,ClassgetAnnotation()方法的定义,并且可以用&来制订多个边界,如<V extends Senrializable & cloneable> void method(){}

普通方法、构造方法和静态方法中都可以使用泛型,编译器也不允许创建类型变量的数组。

也可以用类型变量表示异常,成为参数化的异常,可以用于方法的throws列表中,但不能用于catch子句中。

在泛型中可以同时有多个类型的参数,在定义它们的尖括号中用逗号分开,例如:
public static<K,V> getValue(K key){return map.get(key);}