欢迎来到天天文库
浏览记录
ID:55470000
大小:55.00 KB
页数:4页
时间:2020-05-14
《玩转范型—高级篇.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、JDK6新特性系列——玩转范型(高级篇)范型的语法元素其实是很基本的,只不过将这种语法来回扩展以后,可以编写出相当复杂的范型定义,然而无论再怎么复杂的写法,基本语法大致不变:限制范型可用类型、使用类型通配符,以及范型的扩充与继承几个语法。限制范型可用类型在定义范型类时,默认可以使用任何的类型来实例化范型类中类型持有者,但假设想要限制使用范型类时,如何用某个特定类型或其子类来实例化类型持有者呢?可以在定义类型持有者时,同时使用extends指定这个类型持有者实例化,实例化的对象必须是扩充自某个类型或实现某接口ListGenericFoo在声明类型持有者时,一并指定
2、这个持有者实例化的对象,必须是实现java.util.List接口的类。在限定持有者时,无论要限定的对象是接口或类,都是使用extends关键词。程序中使用extends限定类型持有者实例化的对象,必须是实现List接口的类,象java.util.LinkedList与java.util.ArrayList就实现了List接口,那么如下代码片段是合法的使用方式:但如果不是实现List的类,编译时就会发生错误。例如下面的程序片段通不过编译:因为java.util.HashMap并没有实现List接口(事实上HashMap实现了Map接口),编译器会在编译时检查出这
3、个错误:typeparameterjava.util.HashMapisnotwithinitsboundListGenericFoofoo1=newListGenericFoo();HashMap并没有实现List接口,所以无法作为实例化类型持有者的对象,事实上,当没有使用extends关键字限定类型持有者时,默认是Object下的所有子类都可以实例化类型持有者。也就是说,在定义范型类时如果只写以下代码:其实就相当于以下的定义方法:类型通配符假设使用GenericFoo类来像下面这样声明名称:GenericFoo4、er>foo1=null;GenericFoofoo2=null;那么名称foo1就只能参考GenericFoo类型的实例,而名称foo2就只能参考GenericFoo类型的实例。也就是说,下面的方式的可行的:foo1=newGenericFoo();foo2=newGenericFoo();现在有一个要求,希望有一个参考名称foo可以像下面这样接受所指定的实例:foo1=newGenericFoo();foo2=newGenericFoo5、dList>();简单的说,如果想要一个foo名称可以参考的对象,其类型持有者实例化的对象是实现List接口的类或其子类。要声明这么一个参考名称,可以使用?(通配符)。?代表未知类型,并使用extends关键字来作限定。例如:GenericFoofoo=null;foo=newGenericFoo();…foo=newGenericFoo();…表示类型未知,只知道是实现List接口的类,所以如果类型持有者实例化的对象不是实现List接口的类,则编译器会报告错误6、。例如以下这行无法通过编译:GenericFoofoo=newGenericFoo();因为HashMap没有实现List接口,所以建立的GenericFoo实例不能指定给foo名称来参考,编译器会报告以下的错误:incompatibletypesfound:GenericFoorequired:GenericFooGenericFoofoo=newGenericFoo7、();使用?来作限定有时是很有用的,例如若想要自定义一个showFoo()方法,方法的内容实现是针对String或其子类的实例而定制的。例如:publicvoidshowFoo(GenericFoofoo){//针对String或其子类而指定的内容}如果只作以上的声明,那么像GenericFoo、GenericFoo等类型都可以传入至方法汇总。如果不希望任何类型都可以传入showFoo()方法中,可以使用以下的方式来限制:publicvoidshowFoo(GenericFoofoo){//针对8、String或其子类而制
4、er>foo1=null;GenericFoofoo2=null;那么名称foo1就只能参考GenericFoo类型的实例,而名称foo2就只能参考GenericFoo类型的实例。也就是说,下面的方式的可行的:foo1=newGenericFoo();foo2=newGenericFoo();现在有一个要求,希望有一个参考名称foo可以像下面这样接受所指定的实例:foo1=newGenericFoo();foo2=newGenericFoo5、dList>();简单的说,如果想要一个foo名称可以参考的对象,其类型持有者实例化的对象是实现List接口的类或其子类。要声明这么一个参考名称,可以使用?(通配符)。?代表未知类型,并使用extends关键字来作限定。例如:GenericFoofoo=null;foo=newGenericFoo();…foo=newGenericFoo();…表示类型未知,只知道是实现List接口的类,所以如果类型持有者实例化的对象不是实现List接口的类,则编译器会报告错误6、。例如以下这行无法通过编译:GenericFoofoo=newGenericFoo();因为HashMap没有实现List接口,所以建立的GenericFoo实例不能指定给foo名称来参考,编译器会报告以下的错误:incompatibletypesfound:GenericFoorequired:GenericFooGenericFoofoo=newGenericFoo7、();使用?来作限定有时是很有用的,例如若想要自定义一个showFoo()方法,方法的内容实现是针对String或其子类的实例而定制的。例如:publicvoidshowFoo(GenericFoofoo){//针对String或其子类而指定的内容}如果只作以上的声明,那么像GenericFoo、GenericFoo等类型都可以传入至方法汇总。如果不希望任何类型都可以传入showFoo()方法中,可以使用以下的方式来限制:publicvoidshowFoo(GenericFoofoo){//针对8、String或其子类而制
5、dList>();简单的说,如果想要一个foo名称可以参考的对象,其类型持有者实例化的对象是实现List接口的类或其子类。要声明这么一个参考名称,可以使用?(通配符)。?代表未知类型,并使用extends关键字来作限定。例如:GenericFoofoo=null;foo=newGenericFoo();…foo=newGenericFoo();…表示类型未知,只知道是实现List接口的类,所以如果类型持有者实例化的对象不是实现List接口的类,则编译器会报告错误
6、。例如以下这行无法通过编译:GenericFoofoo=newGenericFoo();因为HashMap没有实现List接口,所以建立的GenericFoo实例不能指定给foo名称来参考,编译器会报告以下的错误:incompatibletypesfound:GenericFoorequired:GenericFooGenericFoofoo=newGenericFoo
7、();使用?来作限定有时是很有用的,例如若想要自定义一个showFoo()方法,方法的内容实现是针对String或其子类的实例而定制的。例如:publicvoidshowFoo(GenericFoofoo){//针对String或其子类而指定的内容}如果只作以上的声明,那么像GenericFoo、GenericFoo等类型都可以传入至方法汇总。如果不希望任何类型都可以传入showFoo()方法中,可以使用以下的方式来限制:publicvoidshowFoo(GenericFoofoo){//针对
8、String或其子类而制
此文档下载收益归作者所有