泛型的作用和使用方法
泛型是(Generics)是JDK1.5 的一个新特性,其实就是一个语法糖(语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。),本质上就是编译器为了提供更好的可读性而提供的一种小手段,小技巧,虚拟机层面是不存在所谓泛型的概念的。
那么我们为什么使用泛型呢,原因在于:
1.通过泛型的语法定义,约束集合元素的类型,进行安全检查,把错误显示在编译期
2.代码通用性更强(后面有案例)
3.泛型可以提升程序代码的可读性,但它只是一个语法糖,对于JVM运行时的性能是没有任何影响的。
编译时类型检查
我们先来看一个简单的集合代码:
Collection c = new ArrayList();c.add(1);c.add(2);System.out.println(c);
我们在编译器上会发现它有一个黄色的警告,但是并没有报错我们也可以运行,但是也就在这个时候,张三想要再往集合中输入几个数字,来通过测试几个数字相加来熟悉集合的方法如何使用,于是他加入了3,4,5
Collection c = new ArrayList();c.add(1);c.add(2);c.add(3);c.add(4);c.add('r');c.add(5);System.out.println(c);
很显然1~5之间混入了一个奇怪的东西但是程序并没有报错,毕竟字符也可以作为元素而存在嘛,但是张三很崩溃,他算不出他想要的答案(他学了一天了,眼睛已经几乎看不到编译器不报错的问题),张三强忍着眼疼,看了好几遍终于流着泪找到了错误。他想,要是编译器会报错就可以了,于是他看了这篇文章。我们看下面的代码:
Collection<Integer> c = new ArrayList();c.add(1);c.add(2);c.add(3);c.add(4);//c.add('r');c.add(5);System.out.println(c);
请允许我把加入字符r的一行注释掉,毕竟它已经开始报错了。这就是泛型最基本的一种用法。
代码通用性更强
我们原来在讲多态的时候通过向上转型的方式,来增加了代码的灵活性(不需要知道子类的具体特点就能实现运行结果)。
我们用泛型同样可以做到甚至做得更好。
public static <E> void print(E[] arr) {for(E e : arr) {System.out.println(e);}}public static void main(String[] args) {Integer[] scores = new Integer[]{ 100,98,80 };String[] names = new String[]{ "语文","数学","英语" };Double[] moneys = new Double[] { 10.1,20.2,30.3 };ApiCollection.print(scores);ApiCollection.print(names);ApiCollection.print(moneys);}
我们将E改为Object也是同样的道理,但是现在用E更符合我们的标题嘛。
类型擦除
泛型只是在编译期间生存,编译后就被干掉了,真正运行时,大多情况下取而代之的是Object。也就是上一个方法的E变成了Object…他的存在只是为了方便我们编程,如果要对类型擦除做详细解释可能要用到反射这个目前还没有讲过,所以我们在这里仅仅先让大家感受一下类型擦除:
List<String> l1 = new ArrayList<String>();List<Integer> l2 = new ArrayList<Integer>();System.out.println(l1.getClass() == l2.getClass());
上述的题目答案为true原因是因为String和Integer的类型均被类型擦除掉了,我们所能看到的编译后的父类都是ArrayList。
泛型的作用和使用方法相关推荐
- java泛型方法作用_java泛型的作用与使用方法是什么?
泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变 ...
- Java 泛型的作用以及类、方法、接口的使用和通配符
一.泛型的作用 1.集合如果不使用泛型: 存的时候什么类型都可以,但是要取的时候会懵,因为取出来啥也不是,或者不知道取的是什么类型的数据.像这样: // 创建ArrayList集合,不 ...
- java泛型的作用和实现原理_java泛型的作用及实现原理
一.泛型的介绍 泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...
- java泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- java泛型类的作用_【Java-泛型系列一-泛型的作用】
1 泛型是什么 泛型是一种在编译期间进行集合中的元素进行限定的机制.使用了泛型,在运行期见可以安全的将元素强转成指定的元素.下面举个例子看一下有和没有泛型的区别 1.1 假如没有泛型 List arr ...
- java泛型的作用_Java 泛型的作用及其基本概念
一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...
- 【泛型】泛型的作用与定义
一.泛型的基本概念 泛型是JDK1.5的一种新特性,它的本质是参数化类型的应用,也就是说操作的数据类型被指定为一个参数,在用到的时候再指定具体的类型.这种参数类型可以用在类.接口和方法的创建中,分别称 ...
- ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法
ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法 参考文章: (1)ios10 safari浏览器 在touchmove 里面写 ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
最新文章
- MATLAB 多项式
- em算法 实例 正态分布_【机器学习】EM算法详细推导和讲解
- CodeForces - 2B The least round way
- Python稳基修炼之计算机等级考试易错细节题3(含答案)
- boot spring 启动 文本_springboot 选择启动某个配置文件
- 收集的材料 关于数据库和抓取器方面的
- XAML实例教程系列 - 类型转换器(Type Converter)
- PythonWEB框架之Tornado
- 【通信】基于matlab Alamouti空频编码【含Matlab源码 801期】
- solaris 8 重置系统配置
- PopClip 能让像苹果电脑像 iOS 一样选中文字后弹出搜索、复制、粘贴等选项
- XJOI字符串的大小关系1级19段
- MCE | 癌相关基因 ALK 参与胖瘦调节
- 如何保存gif表情包里面的部分图片?
- mysql存储过程之错误处理
- python中execute函数_python中的函数是如何使用的?
- php intersect,php array_intersect()函数使用代码
- 还原codeblocks 的Logs others
- 天天生鲜项目——用户信息页
- RobotStudio ABB 仿真软件过期 后的处理