JI1.1.2 泛型类
程序清单JI1-2展示了前一节开始讨论的类OrderedPair。该类假定我们关心对象对中对象的次序。符号在类头的标识符OrderedPair之后。在定义中,T表示两个私有数据域的数据类型、构造方法的两个参数的数据类型、方法getFirst和getSecond的返回类型,以及方法changeOrder中局部变量temp的数据类型。
程序清单JI1-2 类OrderedPair
注:在类Ordered Pair的定义中,T是泛型参数,
跟在类头的标识符name之后。
没有跟在类定义中的构造方法名的后面。
T(不是)可以是数据域、方法参数及局部变量的数据类型,它可以是方法的返回类型。
示例:创建OrderedPair对象。例如,为创建String对象的有序对,可以写如下的语句:
现在,OrderedPair定义中作为数据类型出现的T,都将使用String来替代。
现在这个形式也是可以的。
下列语句是如何使用对象fruit的示例:
注意,有序对fruit有OrderedPair方法changeOrder和getFirst。另外,getFirst返回的对象是String对象,它有方法length。
还要注意的是,有些是非法的。不能将不是字符串的对象对赋给对象fruit:
问题是,不能将OrderedPair转换为OrderedPair。但是可以创建Integer对象的对,如下所示:
现在考虑附录B的程序清单B-1中给出的类Name。如果变量namePair具有类型OrderedPair,你就能创建使用继承派生于Name的任何类的对象对。例如,如果类FormalName派生于Name,但增加了一个头衔,如先生或女士,则namePair可以含有Name和FormalName的对象。
注:在泛型类name的客户中,如下形式的表达式
创建了类的对象。从Java 7版本起,如果将这个表达式赋给一个数据类型是name的变量,则可以忽略表达式中的class-type。即可以写如下的语句:
类的对象的数据类型是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.例如,本章示例中给出的语句,应该有如下的开头:
OrderedPair这个版本的不足是,如果是由不同的和不相关类型的对象组成的对,编译器不能提示你。所以大概会这样写