首页 理论教育 受限类型参数

受限类型参数

时间:2022-02-28 理论教育 版权反馈
【摘要】:前面讨论的class Box<T>是一个泛型类,这个类型参数T没有任何限制,可以将任何具体类型传递给类型参数T。有时候,传递给类型参数T的具体类型需要受到限制,如类型参数T接受的类型只能是Number类或其子类,这就是受限类型参数。

6.7.3 受限类型参数

前面讨论的class Box<T>是一个泛型类,这个类型参数T没有任何限制,可以将任何具体类型传递给类型参数T。有时候,传递给类型参数T的具体类型需要受到限制,如类型参数T接受的类型只能是Number类或其子类,这就是受限类型参数。

定义一个受限类型参数的格式是:

类型参数extends上限类型[&接口类型]

其中:(1)传递给该类型参数的类型实参必须是指定上限类型或其子类;

(2)如果有可选项,类型实参必须实现那些指定的接口;

(3)关键字extends包含了继承类和实现接口两个方面的内容。

【例6-17】 受限类型参数举例。

img413

编译器显示:stringObj=new Box<String>();语句错误,错误的原因是不兼容的类型,找到Box<java.lang.Double>,需要Box<java.lang.Number>。

分析与思考:(1)class Box<T extends Number>说明类型实参必须是Number类或其子类。由于Number、Integer、Double等类是Number类或是其子类,这样,Box<Number>、Box<Integer>、Box<Double>、Box<Float>等都是正确的参数化类型。

(2)而String、Ex6_17等类不是Number类及其子类,所以,Box<String>、Box<Ex6_17>等是不合法的。

(3)Box<Number>numObj;语句说明numObj变量的类型是Box<Number>,numObj=new Box<Double>();语句说明将Box<Double>类型的引用值赋给了numObj变量。这时,编译器就显示Box<Number>与Box<Double>类型不兼容。可见,虽然Number 是Double的超类,但是Box<Number>与Box<Double>不存在继承关系。

类似地,考虑方法public void boxMethod(Box<Number>n){…}。

问:是否允许传递Box<Integer>、Box<Double>、Box<Float>类型?

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

我要反馈