首页 理论教育 泛型类和泛型接口

泛型类和泛型接口

时间:2022-02-28 理论教育 版权反馈
【摘要】:为了避免错误,程序员必须确保只有指定类型的对象才能装入盒子中,其他类型的对象不能装入盒子中。泛型就提供了这种机制,它能使编译器对操作对象的数据类型进行检查,检查对象是否符合指定类型。从而保证了Java语言中的类型安全。在创建泛型类对象时,必须要给类型形参T传递一个具体类型,该具体类型称为类型实参。我们把包含类型实参的泛型类称为参数化类型,如本例的Box<Integer>。

6.7.1 泛型类和泛型接口

在Java SE5.0之前没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器不提示错误,在运行的时候才出现异常,这是一个安全隐患。

下面通过一个例子说明这一安全隐患,并回答为什么要使用泛型。

【例6-13】 使用Object的引用来实现参数“任意化”的举例。

img405

程序运行结果:

img406

在Box类中,有一个私有的Object型成员变量object,有3个成员方法:setObject()方法用于将对象装入盒子里;getObject()方法可以获得盒子中的对象;showType()方法用来显示对象的数据类型。

因为使用Object类型,所以可以创建各种类型的盒子,如整型的盒子、字符串类型的盒子等。

由于getObject()方法的返回类型是Object,所以,intObj.getObject()必须要强制转换为Integer类型,同时为了使程序正确运行,程序员要确保在此之前装入盒子的是一个Integer对象。如果装入的不是一个Integer对象,如intObj.setObject(new Integer(100))改为intObj.setObject(new String(“Hello.”)),那么程序在Integer intO=(Integer)intObj.getObject()中强制转换就会发生错误,将产生异常。类似地,stringObj.getObject();必须要强制转换为String类型,程序员也要确保在此之前装入盒子的是一个String对象。否则,将产生异常。

为了避免错误,程序员必须确保只有指定类型的对象才能装入盒子中,其他类型的对象不能装入盒子中。泛型就提供了这种机制,它能使编译器对操作对象的数据类型进行检查,检查对象是否符合指定类型。从而保证了Java语言中的类型安全。

定义一个泛型类的格式是:

img407

其中:(1)类型变量也称为类型参数、类型形参。如果类型变量有多个,各变量之间用逗号隔开。

(2)一般情况下,类型变量名采用单个大写字母来表示,常用的类型变量名有:

T:类型(Type);  S:第二类型;  U:第三类型;  V:值(Value);

E:元素(Element);  K:关键字(Key);  N:数字(Number)。

【例6-14】 应用泛型改写例6-13,完成同样的功能。

img408

程序运行结果:

与例相同,略。

分析与思考:(1)与非泛型类的定义比较,类名后多了<T>,而且类型变量T能像普通类型一样被用于整个泛型的定义中。如本例声明了成员变量、方法的形参和返回值类型。

(2)class Box<T>声明了一个泛型类,这个类型变量T没有任何限制,可以是任何具体类型,实际上相当于Object类型。

(3)Box<Integer>就是将具体类型Integer传递给类型形参T(类型变量T),这相当于将泛型类class Box<T>中所有出现类型形参T的位置全部替换为Integer后的类定义。

(4)在创建泛型类对象时,必须要给类型形参T传递一个具体类型,该具体类型称为类型实参。我们把包含类型实参的泛型类称为参数化类型,如本例的Box<Integer>。

(5)Box<Integer>intObj=newBox<Integer>();语句规定了Box盒子里的对象只能是Integer类型,这样,诸如intObj.setObject(new String(“Hello.”));语句在编译时会出错,即其他类型对象不能放入盒中。进而,从盒中取出的对象一定是Integer类型,就不需要进行类型转换。

(6)一个类型变量表示一种未确定的引用类型,类型实参应该是一种具体的引用类型,不能是基本类型。如本例将Integer和String分别传递给类型变量T。但是不能将int、double等基本类型传递给类型变量T。

与泛型类的定义类似,泛型接口的定义格式是:

img409

【例6-15】 应用泛型接口改写例6-14,完成同样的功能。

img410

程序运行结果:

与例6-14相同,省略。

分析与思考:可见,与实现接口的普通类相比,实现泛型接口的类是非常类似的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈