2017教师招考报名时间:谁能解释一下Java中Typeparameters的含义?

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/26 17:47:34

ypeparameters:
泛型参数

一般意义上来说,泛型是一种把相同的代码重用在不同的类型上的技术。它作为一个相对独立于其它面向对象特性的技术,在面向对象语言里已经变得越来越普遍了。我们这里之所以讨论泛型,一是因为泛型这种技术本身就很让人感兴趣,另外,也是因为泛型是一个被用来对付二元方法问题(binarymethodproblem)的主要工具。

和subtyping共同使用,泛型可以用来解决一些在方法特化等场合由反协变带来的类型系统的困难。考虑这样一个例子:

我们有Person和Vegitarian两种类型,同时,我们有Vegitable和Food两种类型。而且,Vegitable<:Food.

ObjectTypePersonis



methodeat(food:Food);

end;

ObjectTypeVegetarianis



methodeat(food:Vegitable);

end;

这里,从常识,我们知道一个Vegitarian是一个人。所以,我们希望可以有Vegetarian<:Person.

不幸的是,因为参数是反协变的,如果我们错误地认为Vegetarian<:Person,根据subtype的subsumption原则,一个Vegetarian的对象就可以被当作Person来用。于是一个Vegetarian就可以错误地吃起肉来。

使用泛型技术,我们引入TypeOperator(也就是,从一个类型导出另一个类型,概念上类似于对类型的函数)。

ObjectOperatorPersonEating[F<:Food]is



methodeat(food:F);

end;

ObjectOperatorVegetarianEating[F<:Vegetable]is



methodeat(food:F);

end;

这里使用的技术被称作BoundedTypeParameterization.(Trelli/Owl,Sather,Eiffel,PolyTOIL,Raptide以及GenericJava都支持BoundedTypeParameterization.其它的语言,如C++,只支持简单的没有类型约束的泛型)

F是一个类型参数,它可以被实例化成一个具体的类型。类似于变量的类型定义,一个bound如F<:Vegitable限制了F只能被Vegitable及其子类型所实例化。所以,VegitarianEating[Vegitable],VegitarianEating[Carrot]都是合法的类型。而VegitarianEating[Beef]就不是一个合法的类型。类型VegitarianEating[Vegitable]是VegitarianEating的一个实例,同时它等价于类型Vegitarian.(我们用的是基于结构的subtype)

于是,我们有:

对任意F<:Vegitable,VegitarianEating[F]<:PersonEating[F]

对于原来的Vegitarian类型,我们有:

Vegetarian=VegetarianEating[Vegetable]<:PersonEating[Vegitable]

这种关系,正确地表达了“一个素食者是一个吃蔬菜的人”的概念。

除了BoundedTypeParameterization之外,还有一种类似的方法也可以解决这个素食者的问题。这种方法被叫做:BoundedAbstractType

请看这个定义:

ObjectTypePersonis

TypeF<:Food;



varlunch:F;

methodeat(food:F);

end;

ObjectTypeVegetarianis

TypeF<:Vegitable;



varlunch:F;

methodeat(food:F);

end;

这里,F<:Food的意思是,给定一个Person,我们知道他能吃某种Food,但我们不知道具体是哪一种。这个lunch的属性提供这个Person所吃的Food.

在创建Person对象时,我们可以先选定一个Food的subtype,比如说,F=Dessert.然后,用一个Dessert类型的变量赋给属性lunch.最后再实现一个eat(food:Dessert)的方法。

这样,Vegetarian<:Person是安全的了。当你把一个Vegetarian当作一个Person处理时,这个Vegitarian可以安全地吃他自带的午餐,即使你不知道他吃的是肉还是菜。

这种方法的局限在于,Person,Vegitarian只能吃他们自带的午餐。你不能让他们吃买来的午餐。