欢迎来到天天文库
浏览记录
ID:40587074
大小:64.50 KB
页数:5页
时间:2019-08-04
《介绍JDK5.0中的泛型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、集合类到目前为止,Java类库中泛型支持存在最多的地方就是集合框架。就像容器类是C++语言中模板的主要动机一样(参阅 附录A:与C++模板的比较)(尽管它们随后用于很多别的用途),改善集合类的类型安全是Java语言中泛型的主要动机。集合类也充当如何使用泛型的模型,因为它们演示了泛型的几乎所有的标准技巧和方言。所有的标准集合接口都是泛型化的—— Collection、List、Set 和 Map。类似地,集合接口的实现都是用相同类型参数泛型化的,所以 HashMap 实现
2、Map 等。集合类也使用泛型的许多“技巧”和方言,比如上限通配符和下限通配符。例如,在接口 Collection 中,addAll 方法是像下面这样定义的:interfaceCollection{booleanaddAll(Collection);}该定义组合了通配符类型参数和有限制类型参数,允许您将 Collection 的内容添加到 Collection。如果类库将 addAll() 定义为接受 Collection,您就
3、不能将 Collection 的内容添加到 Collection。不是限制addAll() 的参数是一个与您将要添加到的集合包含相同类型的集合,而有可能建立一个更合理的约束,即传递给 addAll() 的集合的元素 适合于添加到您的集合。有限制类型允许您这样做,并且使用有限制通配符使您不需要使用另一个不会用在其他任何地方的占位符名称。应该可以将 addAll() 的类型参数定义为 Collection。但是,这不但没什么用,而且还会改变 Collection 接口的语义
4、,因为泛型版本的语义将会不同于非泛型版本的语义。这阐述了泛型化一个现有的类要比定义一个新的泛型类难得多,因为您必须注意不要更改类的语义或者破坏现有的非泛型代码。作为泛型化一个类(如果不小心的话)如何会更改其语义的一个更加微妙的例子,注意 Collection.removeAll() 的参数的类型是Collection>,而不是 Collection。这是因为传递混合类型的集合给 removeAll() 是可接受的,并且更加限制地定义removeAll 将会更改方法的语义和有用性。回页
5、首其他容器类除了集合类之外,Java类库中还有几个其他的类也充当值的容器。这些类包括 WeakReference、SoftReference 和 ThreadLocal。它们都已经在其包含的值的类型上泛型化了,所以 WeakReference 是对T类型的对象的弱引用,ThreadLocal 则是到T类型的线程局部变量的句柄。回页首泛型不止用于容器泛型最常见最直观的使用是容器类,比如集合类或引用类(比如 WeakReference)。Collection 中类型参数的含义很明显——“一
6、个所有值都是V类型的集合”。类似地,ThreadLocal 也有一个明显的解释——“一个其类型是T的线程局部变量”。但是,泛型规格说明中没有指定容积。像 Comparable 或 Class 这样的类中类型参数的含义更加微妙。有时,就像 Class 中一样,类型变量主要是帮助编译器进行类型推理。有时,就像隐含的 Enum> 中一样,类型变量只是在类层次结构上加一个约束。回页首ComparableComparable 接口已经泛型化了,所以实现 Co
7、mparable 的对象声明它可以与什么类型进行比较。(通常,这是对象本身的类型,但是有时也可能是父类。)publicinterfaceComparable{publicbooleancompareTo(Tother);}所以 Comparable 接口包含一个类型参数 T,该参数是一个实现 Comparable 的类可以与之比较的对象的类型。这意味着如果定义一个实现 Comparable 的类,比如 String,就必须不仅声明类支持比较,还要声明它可与什么比较(通常是与它本身比较):publiccl
8、assStringimplementsComparable{...}现在来考虑一个二元 max() 方法的实现。您想要接受两个相同类型的参数,二者都是 Comparable,并且相互之间是 Comparable。幸运的是,如果使用泛型方法和有限制类型参数的话,这相当直观:publicstatic>Tmax(Tt1,Tt2){if(t1.co
此文档下载收益归作者所有