数据结构与算法分析(Java描述)学习笔记 第一章
在本章的学习中,学习了一些有关泛型的知识。下面进行一定程度的总结。
1.4.3 使用接口类型表示泛型
在进行函数参数的传入时,我们可以用诸如下面的形式,传入参数
Public static Comparable findMax(Comparable [] arr)
这个语句的意思是,传入一个参数,该参数是一个了Comparable接口,该函数的返回类型也是一个实现了Comparable的数组。
1.4.4与1.5.7 数组类型的兼容性与类型擦除
在这两节中,学习的是有关协变数组与类型擦除的知识。
协变数组:指的是Shape,Square ,Square继承了Shape,并且理所应当的Square[] 也可以存入Shape[]中(这种特性可以称之为协变的特性),但是这样会导致如下的问题
Person[] arr=new Employee[5];
arr[0]=new Student();
这样的话编译不会报错,但是在程序运行的时候会产生ArrayStoreException的问题。
但泛型并不具有协变的性质。如下编译失败。
public static void main(String[] args) {
List< Object> list = new ArrayList< String>();
list.add( 10 );
}
类型擦除:Java的泛型并不是真正的泛型,它针对的是Java语言而不是Java虚拟机,在编译的过程中,它会产生一种类型擦除的机制,即将<>运算符中的类型进行暂时性的“擦除”,在被调用的时候,一些相应的特性才会被加入。由此也可以得出结论,对于使用泛型生成的代码与原始并无太大差异,其优点在于,将运行时的错误在编译阶段就可以体现出来,因此,泛型常常用于Map以及Collection的使用中。
1.5.6 类型限界
在该部分中,类型限界主要是对泛型进行限界,例如
<T extends Shape>
判断传进来的泛型T是否继承于Shape,若Shape是用泛型定义的泛型类,那么就会变成这样
< T extends Shape<? super T>>
这便已经是最复杂的形式
1.6 函数对象
函数对象的传入也满足泛型的规律,
T findMax(T arr[],Comparator<? super T> cmp)
一个函数,返回T类型,第一个参数为T类型的数组,第二个参数为一个对象,该对象实现了Comparator,
其他
Java实现了自动装箱与自动拆箱,实现基本类型与引用类型的转换
instance of 仅对原始类(非泛型类)进行检测与类型转换工作。
对于Static方法,不可引用类的类型变量(泛型变量)。
参数化数组不可实例化,即一个数组的定义由泛型组成不可直接实例化。可以通过非参数化数组将之转换,但并无实际作用。