lt;数据结构与算法分析gt;读书笔记--实现泛型构件pre-Java5(2)
示例三(如何能够使用MemoryCell来存储整数): cn.pre.example; * 基本类型包装类 * WrapperDemo { MemoryCell(); m.write(new Integer(37)); Integer wrapperVal = (Integer) m.rend(); int val = wrapperVal.intValue(); System.out.println("Contents are:"+val); } } ? 基本数据对应的包装类: byte -> Byte short ->Short int -> Integer long ->Long double ->Double float ->Float char ->Character boolean -> Boolean ? 3.使用接口类型表示泛型只有在使用Object类中已有的那些方法能够表示所执行的操作的时候,才能使用Object作为泛型类型来工作。 例如,考虑在由一些项组成的数组中找出最大项的问题。基本的代码是类型无关的,但是它的确需要一种能力来比较任意两个对象,并确定哪个是大的,哪个是小的。因此,我们不能直接找出Object的数组中的最大元素。最简单的想法是找出Comparable的数组中最大元。要确定顺序,可以使用compareTo()方法,我们知道,它对所有的Comparable都必然是现成可用的。 现在,提出几个忠告很重要。首先,只有实现Comparable接口的那些对象才能够作为Comparable数组的元素被传递。仅有compareTo()方法但并未宣称实现Comparable接口的对象不是Comparable的,它不具有必需的IS-A关系。因为我们也许会比较两个Shape的面积,因此假设Shape实现Comparable接口。 第二,如果Comparable数组有两个不相容的对象(例如一个String和一个Shape),那么Comparable方法将抛出异常ClassCastException(类型转换异常)。 第三,如前所述,基本类型不能作为Comparable传递,但是包装类则可以,因为它们实现了Comparable接口。 第四,接口究竟是不是标准的库接口倒不是必需的。 最后,这个方案不是总能够行得通,因为有时宣称一个类实现所需的接口是不可能的。例如,一个类可能是库中的类,而接口却是用户定义的接口。如果一个类是final类,那么我们就不可能扩展它以创建一个新的类。 4.数组类型的兼容性语言设计中的困难之一是如何处理集合类型的继承问题。设Employee IS-A Person。那么,这是不是意味着数组Employee[] IS -A Person[]呢?换句话说,如果一个例程接受Person[]作为参数,那么我们能不能把Employee[]作为参数来传递呢? 咋看,该问题不值得一问,似乎Employee[]就应该是和Person[]类型兼容的。然而这个问题比想象中要复杂。假设除Employee外,我们还有Studeng IS-A Person,并设Employee[]是和Person[]类型兼容的。此时考虑下面两条赋值语句: Person[] arr = new Employee["5];//编译:arrays are compatible arr[0]= new Student(...);//编译: Studeng IS-A Person 两句都编译,而arr[0]实际上是引用一个Employee,可是Student IS-NOT-A Employee。这样就产生了类型混乱。运行时系统(runtime system)不能抛出ClassCastException异常,因为不存在类型转换。 ? 避免这种问题的最容易的方法是指定这些数组不是类型兼容的。可是,在Java中数组却是兼容的。这叫做协变数组类型。每个数组都明了它所允许存储的对象的类型。 如果将一个不兼容的类型插入到数组中,那么虚拟机将抛出ArrayStoreException异常(数组存储异常)。 ? 示例代码我已经提交到我的Github,有需要可克隆下载。 代码地址为:https://github.com/youcong1996/The-Data-structures-and-algorithms/tree/master/Introduction ? (编辑:ASP站长网) |