java 定义泛型接口_泛型类和泛型接口_Java语言程

泛型类和泛型接口_Java语言程

6.7.1 泛型类和泛型接口

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

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

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

b8c9cdf51753a6614891566bca2678a1.png

程序运行结果:

cfa18690bb8d52bbbf24b821c07b233a.png

在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语言中的类型安全。

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

e208006258d2a86ff53ed465b5a44a2d.png

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

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

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

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

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

5708d1fe7d132d14aabbeba660400c29.png

程序运行结果:

与例相同,略。

分析与思考:(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。

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

57daaf99334fb170faaedd71cd614037.png

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

14ed7b010bf81acef44dfb3992d973fe.png

程序运行结果:

与例6-14相同,省略。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值