一、函数参数与泛型比较

泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型。泛型的作用是什么,这里与函数参数做一个比较:

无参数的函数:

public int[] newIntArray(){return new int[6];

}

函数功能即返回一个大小为6的数组,但是这个函数只能返回固定大小为6的数组,如果想返回不同size的数组则还要重新编写函数。解决方法就是使用函数参数,传入一个代表数组大小的size。

有参数的函数:我们在写一个函数时,往往需要向函数传入一些参数,使得函数具有一定的通用性,完成某些特定的功能,如:

public int[] newIntArray(intsize){return new int[size];

}

这是一个简单的函数,传入参数size,函数会生成相应大小的整型数组返回给我们。但是这里有一个限制,我们只能得到整型的数组,这就大大限制了这个函数的功能和可重用性,那么当我们想要得到一个浮点型数组时又要编写一个非常类似的函数。这里的解决办法就是使用泛型:

有参数且使用泛型的函数

@SuppressWarnings("unchecked")public static T[] newArray(intsize) {

Object array= newObject[size];return(T[])array;

}

在函数内部我们使用了Object来新建数组,而不是直接用类型参数T直接声明(由于Java泛型的擦除所致,见【Java心得总结四】Java泛型下——万恶的擦除)。通过这个函数,我们就能够得到“任意大小任意类型”的数组。

总结:比较上面三个示例,我们就能理解为什么要有泛型这个概念了。在上面的示例中,每一级的例子都比前一级的例子功能上更加扩展,可重用性更加的高。第一个示例我们只能得到固定大小的数组;为了更加泛化,我们使用参数传入size来得到不同大小的数组;同样为了得到不同类型的数组,我们甚至将类型也作为参数传递入函数,从而得到任意大小任意类型的数组。

综上,我们利用泛型来解耦类或方法与所使用的类型之间的约束,将类型也作为一种参数传入,使得类或方法的可重用性大大提高。

二、泛型类

声明格式:

public class Generics{

K k;

V v;publicGenerics(K k, V v) {this.k =k;this.v =v;

}

}

泛型类的声明一般放在类名之后,可以有多个泛型参数,用尖括号括起来形成类型参数列表。

应用:

泛型类应用最广泛的就是我们在平时Java编程中最最常用到的容器类(参见博文【Java心得总结五】Java容器上——容器初探),举一个容器的简单例子:

importjava.util.ArrayList;importjava.util.Date;importjava.util.Random;public class RandomList{private ArrayList storage = new ArrayList();private Random rand = new Random(newDate().getTime());public voidadd(T item) {

storage.add(item);

}publicT select() {returnstorage.get(rand.nextInt(storage.size()));

}

}

这段代码将原有的ArrayList容器进行了封装,调用select函数会随机的返回一个列表中的元素。

三、泛型接口

声明格式:

public interface Generator{publicT next();

}

同泛型类的声明类似,在接口名之后,用尖括号将所有类型参数括起来。注:这里声明的是一个工厂设计模式常用的生成器接口。

应用:

我们平时编程最常见的泛型接口就是Iterable接口,即迭代器接口(参见博文【Java心得总结五】Java容器上——容器初探),举一个简单的例子:

importjava.util.ArrayList;importjava.util.Date;importjava.util.Iterator;importjava.util.Random;public class RandomList implements Iterable{private ArrayList storage = new ArrayList();private Random rand = new Random(newDate().getTime());public voidadd(T item) {

storage.add(item);

}publicT select() {returnstorage.get(rand.nextInt(storage.size()));

}/*实现Iterable接口*/

public Iteratoriterator() {returnstorage.iterator();

}

}

还是上面泛型类举得容器例子,这次我们给RandomList类部署了Iterable接口,这样我们就可以利用foreach语句对RandomList中的元素进行遍历。

四、泛型方法

声明格式:

public T genericMethod(T t){returnt;

}

泛型方法的声明和泛型类的声明略有不同,它是在返回类型之前用尖括号列出类型参数列表,而函数传入的形参类型可以利用泛型来表示。

应用:

见文章开头的例子。

五、Java泛型的局限性

1.基本类型(

2.在泛型代码内部,无法获得任何有关泛型参数类型的信息(见【Java心得总结四】Java泛型下——万恶的擦除)。换句话说,如果传入的类型参数为T,即你在泛型代码内部你不知道T有什么方法,属性,关于T的一切信息都丢失了(类型信息,博文后续)。

3.注,在能够使用泛型方法的时候,尽量避免使整个类泛化。

java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型相关推荐

  1. Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图

    Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图 1.上传图片并返回灰度图功能 由于使用的springboot开发,直接写一个upload接口供图片上传,以下是spri ...

  2. java实验报告金陵科技学院_金陵科技学院java

    <Java语言程序设计>学生信息管理_理学_高等教育_教育专区.学生信息管理系统,金陵科技学院 <Java 语言程序设计>课程考查报告 题 目: 学生信息管理程序 学生姓名.. ...

  3. java集合到线程的考试_成都汇智动力-Java SE考试编程题总结

    原标题:成都汇智动力-Java SE考试编程题总结 线程和进程的区别: (1)进程是运行中的程序,拥有自己独立的内存空间和资源; (2)一个进程可以有一个或多个线程组成,且至少有一个线程称为主线程; ...

  4. java获取当月有几天_你真的能在JAVA开发这条路上面一直坚持下去吗?

    JAVA为什么有前途? 过去的十多年,JAVA基本每年都是全世界使用人数第一的语言.全世界数百万的IT企业构建了庞大的JAVA生态圈,大量的软件基于JAVA开发. JAVA也被誉为"计算机界 ...

  5. java实验报告 05 类与_java程序设计类与方法-java实验报告

    java程序设计类与方法-java实验报告 java程序设计类与方法-java实验报告 1. 实验内容或题目 (1) 编写Java应用程序,实现以下功能:当应用程序运行后,根据屏幕提示进行交互式输入并 ...

  6. java 设置两个方法互斥_分享两个操作Java枚举的实用方法

    1. 前言 Java枚举在开发中是非常实用的.今天再来分析几个小技巧并且回答一些同学的的疑问.首先要说明的是我的枚举建立在以下的范式之中: 枚举统一接口范式 2. 如何把枚举值绑定的下拉列表 这种场景 ...

  7. java教学视频毕向东_集合3--毕向东java基础教程视频学习笔记

    Day 15 集合框架 01 TreeSet 02 TreeSet存储自定义对象 03 二叉树 04 实现Comparator方式排序 05 TreeSet练习 06 泛型概述 07 泛型使用 08 ...

  8. java 电池类类代码举例_下面哪个不是java中的关键字?

    [简答题]Java的字符类型采用的是ASCII编码. [简答题]1. 介绍16日野外考察时,你的研究区的岩性,如果以该岩石制作岩样进行单轴压缩实验,请预估一下它的应力应变曲线的特征. [其它]乡村旅游 ...

  9. Java好还是网优好_大神告诉你|Java好还是Python好?

    在进入主题之前,小智先分享几条大神的人生警句.醒世明言: 初学者才争论语言,我们只看心情. 还有: 选择入门语言最重要的是 "三观"相似 "臭味"相投 以及大家 ...

最新文章

  1. webpack打包优化_前端性能优化:webpack性能调优与Gzip原理
  2. 26. Intellij IDEA 启动项目ClassNotFoundException
  3. 使用git pull文件时和本地文件冲突怎么办
  4. 使用SAP Cloud Platform Leonardo机器学习的测试控制台
  5. essential-phone的相关体验
  6. 【同行说技术】Java程序员小白变大神必读资料汇总(三)
  7. LA 3882 And Then There Was One
  8. 东北到底有没有互联网?!
  9. pip换源及指令的使用
  10. JB的Python之旅-爬虫篇--requestsScrapy
  11. 《前端框架开发技术》HTML+CSS+JavaScript 制作个人简历模板
  12. idea中设置字体大小
  13. 如何通过努力出书,如何写有畅销资质的书,本文汇集了多位计算机图书作者的经验...
  14. 北京市公布533家接种点名单 (zz)
  15. MJB,阿里又一次成功的营销?
  16. 菜鸡帆并不算长の编程之旅回顾
  17. Godaddy创始人:成就亿万富翁的10条规则
  18. (21)恢复数据(recovery)时间和撤销数据(removal)时间
  19. 吉林全国计算机报名系统入口,http://ncre.jleea.com.cn吉林计算机等级考试报名系统入口...
  20. 阿里云服务器搭建wordpress个人博客

热门文章

  1. 对中职计算机教学的思考,中职计算机教学思考
  2. html和c的区别,tn-s系统与TN-C的区别是什么
  3. java 接口中的成员只有静态常量和_Java中抽象类和接口的具体区别是什么?
  4. ios笔试题算法_iOS 算法面试题(一)
  5. python具备的功能是_用了Python这么多年,揭秘Python不为人知的7大功能和特点!...
  6. VS2010中使Unity3d的shader文件关键字高亮
  7. Pyqt5:使用Qlabel标签进行视频播放
  8. 逐步淘汰,微软宣布多款产品将停止支持 IE11
  9. linux 网卡no carrier,linux centos 7 网卡突然不能上网异常解决
  10. 顶岗实习周记java方向_JAVA软件开发——顶岗实习周记25篇.doc