前面从泛型方法的用法介绍到了泛型的起源,既然单个方法允许拥有泛化的参数类型,那么一个类也应当支持类级别的泛化类型,例如各种容器类型ArrayList、HashMap等等。一旦某个类的定义代码在类名称后面添加“<T>”这种泛型声明,该类就变成了泛型类(也称模板类)。况且泛型类不单单支持一种泛型参数,还支持同时声明多种泛型参数,像“<T>”表示当前类存在唯一一种泛型参数;若想声明当前类拥有两种泛型参数,则可使用“<T, R>”这种以逗号隔开的泛型列表;同时声明三种泛型参数的话,尖括号内的泛型列表就有三个参数,形如“<U, V, W>”这般;至于更多种泛型参数的声明方式可依此类推。
在泛型类的内部代码中,事先已经声明的泛型可以拿来直接使用,无需在成员方法前面额外添加“<T>”。除此之外,在类代码中使用泛型T就跟使用普通类型一样,可以用它来创建泛型实例,可以用它表示输入参数的类型,也可以用它表示输出参数的类型。举个泛型类的简单应用例子,现在准备利用清单List来保存数据,然后想获取这组数据当中最长的元素,以及最短的元素。按照前述需求,划分该泛型类应当具备的功能,初步罗列包括以下几点:
1、泛型类要声明一个泛型参数“<T>”,用于给清单需要的元素类型占位;
2、定义泛型类的构造方法,传入待保存的清单对象,其中对象类型为“List<T>”;
3、定义getMaxLengthItem方法,用于获取长度最大的清单元素,注意该方法的输出参数类型为T;
4、定义getMinLengthItem方法,用于获取长度最小的清单元素,该方法的输出参数类型也为T;
根据上面的几点功能要求,编码实现的泛型类代码示例如下:

//定义简单的泛型清单。
//类名后面添加“<T>”,表示该类的内部代码中,所有的T类型都为外部需要时再指定的泛型。
//如果泛型不止一个,则用逗号隔开,比如两个泛型可用“<T, R>”。
public class SimpleList<T> {private List<T> list; // 清单。注意清单元素的数据类型为泛型T// 构造方法,传入要保存的清单数据public SimpleList(List<T> list) {this.list = list;}// 获取当前保存的清单数据public List<T> getData() {return this.list;}// 获取长度最大的清单元素。注意这里的返回数据为泛型Tpublic T getMaxLengthItem() {if (list == null || list.size() <= 0) {return null;}T t = list.get(0); // 利用T声明了一个泛型变量tfor (int i = 0; i < list.size(); i++) {if (list.get(i).toString().length() > t.toString().length()) {t = list.get(i);}}return t;}// 获取长度最短的清单元素。注意这里的返回数据为泛型Tpublic T getMinLengthItem() {if (list == null || list.size() <= 0) {return null;}T t = list.get(0); // 利用T声明了一个泛型变量tfor (int i = 0; i < list.size(); i++) {if (list.get(i).toString().length() < t.toString().length()) {t = list.get(i);}}return t;}
}

从这个泛型类的代码可知,泛型T犹如系统自带的数据类型一般,它在泛型类内部的使用毫无障碍,你可以把它想象为Integer类型,或者Double类型。纵观整个泛型类的代码,唯有最开始的类名后面多了个“<T>”,其它地方跟普通类就没什么两样了。

外部调用泛型类的时候,可参照ArrayList、HashMap等容器类的用法,同样在类名后面添加形如“<具体的数据类型名称>”的模板。下面是段SimpleList的测试代码,先构造指定清单的泛型实例,再分别调用getMaxLengthItem与getMinLengthItem方法获取最长的元素和最短的元素,完整代码如下所示:

        // 数组工具Arrays的asList方法可以把一系列元素直接赋值给清单对象List<Double> doubleList = Arrays.asList(1.1, 2D, 3.1415926, 11.11);// 泛型实例的参数类型跟在类名称后面,以尖括号包裹SimpleList<Double> simpleList = new SimpleList<Double>(doubleList);// 打印清单中最长的元素System.out.println("simpleList.getMaxLengthItem()=" + simpleList.getMaxLengthItem());// 打印清单中最短的元素System.out.println("simpleList.getMinLengthItem()=" + simpleList.getMinLengthItem());

运行以上的测试代码,观察到下面的日志结果,可见泛型类SimpleList正确挑选出了最长的元素和最短的元素:

simpleList.getMaxLengthItem()=3.1415926
simpleList.getMinLengthItem()=1.1

  

更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/10499764.html

Java开发笔记(六十九)泛型类的定义及其运用相关推荐

  1. 【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石:几种几何体的快捷绘制法

    本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载.(这标题有些歧义的,这个几种是修饰 ...

  2. Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

  3. JAVA学习笔记(三十九)-打印流

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; i ...

  4. .Net开发笔记(十九) 创建一个可以可视化设计的对象

    阅读本篇博客之前需要了解VS窗体设计器的工作原理,详细可参见本系列博客(十).(十一).(十二).必须需要知道的一条结论就是:处于窗体设计器(Form Designer)中的任何组件(包含控件,下同) ...

  5. 校友会小程序开发笔记二十九:小程序启动性能评测与优化(2)

    校友会小程序定位是大量校友的社交类应用,因此对于性能,用户体验,交互体验要求很高,对于小程序的打开,流畅性, 数据的渲染都必须做尽可能的优化 运行时性能 setData setData 是校友会小程序 ...

  6. 前端入门学习笔记六十九

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>输入框 ...

  7. OSG开发笔记(十九):OSG文字显示

    若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/97262841 各位读者,知识无穷而人力有穷,要 ...

  8. iOS开发笔记之五十九——OS X和iOS安全机制之一——签名机制

    一.背景 在OS X上病毒和恶意软件很少见,给大家的感觉是OS X和iOS更加安全.到底是什么原因导致的OS X更加安全呢? (1)OS X占有率较低,没有吸引足够的恶意软件开发者的注意(假设你是恶意 ...

  9. JAVA学习笔记(四十九)- Swing相关组件

    JFrame组件 import java.awt.Color;import javax.swing.JFrame; import javax.swing.JPanel;/** Swing是在AWT基础 ...

  10. android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

最新文章

  1. Java code lib aes 加解密
  2. SpringBatch tasklet实现和用法(十)
  3. 知识储备—01-进程,线程,多线程相关总结
  4. 用excel 2016连接mysql_excel导入mysql数据库方法(最新,2016年2月19日)
  5. 源服务器未能找到目标资源的表示或者不愿,java - 源服务器没有找到目标资源的当前表示,或者不愿意透露一个存在。 关于部署到 tomcat - 堆栈内存溢出...
  6. spring.net结合普通三层(实现IOC 及AOP中的异常记录功能)
  7. E-Prime学习笔记
  8. Python标准库——turtle库
  9. 塔尔萨大学计算机科学专业,塔尔萨大学专业
  10. android写日记app,写日记的app哪个好用 写日记的软件有哪些
  11. 阿里云服务器固定ip和弹性公网ip
  12. 微信小程序选择图片并转base64
  13. 《计算机工程》投稿经验分享
  14. Tomcat 在本地创建虚拟目录myapp
  15. python训练opencb分类器_垃圾邮件分类.ipynb
  16. 最后一批!十几所大学计算机考研改考、新增专业统计
  17. JAVA 正则表达式 (超详细)
  18. OpenLayers基础教程——要素样式的创建
  19. 首席新媒体黎想教程:活动推广提升线下活动转化率?
  20. 【Cocos2d-X】独立开发并发布自己的第一款android手游——SpaceWar

热门文章

  1. 人脸验证(五)--NormFace
  2. axios发送网络请求
  3. 局域网访问虚拟机服务器桥接,虚拟机让局域网访问的方法---桥接模式
  4. pear php有什么用?,php – PEAR和PEAR2有什么区别?
  5. 荷兰 转专业申请计算机,荷兰留学转专业申请须知
  6. 【JAVA程序设计】基本数据类型
  7. 有趣的检查边界面试题
  8. python输出excel能够识别的utf-8格式csv文件
  9. 根据微信的公众号获取公众号的二维码 根据公众号获得二维码的图片
  10. ubuntu Shell