《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第1章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学  新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

JI1.1.2 泛型类

程序清单JI1-2展示了前一节开始讨论的类OrderedPair。该类假定我们关心对象对中对象的次序。符号在类头的标识符OrderedPair之后。在定义中,T表示两个私有数据域的数据类型、构造方法的两个参数的数据类型、方法getFirst和getSecond的返回类型,以及方法changeOrder中局部变量temp的数据类型。
程序清单JI1-2 类OrderedPair
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

注:在类Ordered Pair的定义中,T是泛型参数,
跟在类头的标识符name之后。

没有跟在类定义中的构造方法名的后面。
T(不是)可以是数据域、方法参数及局部变量的数据类型,它可以是方法的返回类型。

示例:创建OrderedPair对象。例如,为创建String对象的有序对,可以写如下的语句:

《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

现在,OrderedPair定义中作为数据类型出现的T,都将使用String来替代。

程序设计技巧:在Java 7之前,前面这条Java语句都需要写两遍数据类型String,如下所示:

《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

现在这个形式也是可以的。
下列语句是如何使用对象fruit的示例:
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

这些语句的输出是
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

注意,有序对fruit有OrderedPair方法changeOrder和getFirst。另外,getFirst返回的对象是String对象,它有方法length。
还要注意的是,有些是非法的。不能将不是字符串的对象对赋给对象fruit:
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

问题是,不能将OrderedPair转换为OrderedPair。但是可以创建Integer对象的对,如下所示:
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

输出不出所料是:
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

现在考虑附录B的程序清单B-1中给出的类Name。如果变量namePair具有类型OrderedPair,你就能创建使用继承派生于Name的任何类的对象对。例如,如果类FormalName派生于Name,但增加了一个头衔,如先生或女士,则namePair可以含有Name和FormalName的对象。

注:在泛型类name<class-type>的客户中,如下形式的表达式

《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

创建了类的对象。从Java 7版本起,如果将这个表达式赋给一个数据类型是name的变量,则可以忽略表达式中的class-type。即可以写如下的语句:
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

类的对象的数据类型是name,不是name。

自测题1 像String或Name这样的类必须定义哪些方法才能让OrderedPair的方法toString正常工作?
自测题2 考虑程序清单JI1-2中所给出的类OrderedPair。假定我们没有使用泛型,而是忽略,将私有域的数据类型、方法参数及局部变量声明为Object而不是T。这些修改对类的使用有什么影响?

自测题3 你能使用程序清单JI1-2中定义的类OrderedPair,让两个不同及不相关的数据类型的对象配对吗?为什么?
自测题4 使用附录C的程序清单C-1中定义的类Name,写语句,将两名学生组成实验搭档。

自测题答案

  1. toString
    2.例如,本章示例中给出的语句,应该有如下的开头:

《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

OrderedPair这个版本的不足是,如果是由不同的和不相关类型的对象组成的对,编译器不能提示你。所以大概会这样写
《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

3.不能。类仅定义了一个泛型。
4.《数据结构与抽象:Java语言描述(原书第4版)》一JI1.1.2 泛型类

上一篇:mysql全文索引代替like查询


下一篇:js中addEventListener第三个参数涉及到的事件捕获与冒泡