Java 容器 & 泛型:六、容器讲到为什么要使用泛型
Writer:BYSocket(泥沙砖瓦浆木匠)
微博:BYSocket
豆瓣:BYSocket
ArrayList是集合类中无处不在的,泛型也是,泛型对集合类尤其有用。但是为啥要使用泛型?理解好了这个问题可以帮助理解相关的更多知识点。下面泥瓦匠以最简单的例子来验证这个问题。
一、泛型
泛型的目的是为了可以让更多不同类型的对象重用。没错,这样理解就太low。真正目的是为了在编译时找到bug,而不是在运行时。(编译时,指的是源代码翻译成机器识别的代码的时候。运行时,是指代码在机器中运行的时候。)泛型只存在编译时,理解这个可以帮助你更好的理解泛型。
这样,在编译时会比在运行时更容易地找到bug和修复。

二、实现没有泛型的简易版ArrayList
简易版的ArrList有个Obejct对象(因为是Object,我们可以add任意类型。)比如说,Integer 和 String的。代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package javaBasic.generic;/** * 简易版ArrayList */class ArrList{ private Object obj; public Object getObj() { return obj; } public void add(Object obj) { this.obj = obj; } }public class TestArrayList{ public static void main(String[] args) { ArrList arrList = new ArrList(); arrList.add(1); arrList.add("1"); Integer objInt = (Integer) arrList.getObj(); System.out.println(objInt); }} |
运行可以看出会出现ClassCastException:
|
1
2
|
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at javaBasic.generic.TestArrayList.main(TestArrayList.java:30) |
想问的问题是:”这Object对象属性,怎么不能强转呢?“
答:编译时,代码没错的。运行main时,当set了String类型时,将结果强制转换为Integer就会报错这个错了。
泥瓦匠的记忆宫殿又来了:
1、使用泛型比那些杂乱的需要强制转换的Object代码具有更好的安全性和可读性。
2、使用泛型可以在编译时轻松找到和解决bugs
三、使用改写简易版ArrayList
使用泛型代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package javaBasic.generic;/** * 简易版ArrayList */class ArrList<T>{ private T obj; public T getObj() { return obj; } public void add(T obj) { this.obj = obj; } }public class TestArrayList{ public static void main(String[] args) { ArrList<Integer> arrList = new ArrList<>(); arrList.add(1);// arrList.add("1"); Integer objInt = arrList.getObj(); System.out.println(objInt); }} |
这时候如果想用
|
1
|
arrList.add("1"); |
会发现:
![]()
这时候就是泛型大显身手的时候,也不用需要对属性 get 方法时的强制转换。其实, Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。这里T就相当于Integer。
四、小结
泥瓦匠记忆宫殿:
1、在编译时检查强类型
2、显示转换的消除(上面的Integer get省去)
3、更好地实现代码重用和泛型算法
4、使用泛型比那些杂乱的需要强制转换的Object代码具有更好的安全性和可读性。
Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。哈哈~下次说这个。
Writer:BYSocket(泥沙砖瓦浆木匠)
微博:BYSocket
豆瓣:BYSocket
Java 容器 & 泛型:六、容器讲到为什么要使用泛型的更多相关文章
- Java基础 -- 持有对象(容器)
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- 持有对象:总结JAVA中的常用容器和迭代器,随机数 速查
JAVA使用术语“Collection”来指代那些表示集合的对象,JAVA提供的接口很多,首先我们先来记住他们的层次结构: java集合框架的基本接口/类层次结构 java.util.Collecti ...
- Java的同步容器和并发容器
前言: 之前在介绍Java集合的时候说到,java提供的实现类很少是线程安全的.只有几个比较古老的类,比如Vector.Hashtable等是线程安全的,尤其是Hashtable,古老到连命名规范都没 ...
- Java:常用的容器小记
Java:常用的容器小记 对 Java 中的 常用容器,做一个微不足道的小小小小记 容器类概述 常见容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 M ...
- [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个 ...
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- JAVA同步容器和并发容器
同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...
- java并发:同步容器&并发容器
第一节 同步容器.并发容器 1.简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同 ...
- Java并发——同步容器与并发容器
同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...
随机推荐
- Python从入门到精通之Second!
初识Python基础! -基础 -扩展名可以是任意的,但是导入模块时,如果不是.py文件就会报错. -两种执行方式 1.python解释器 文件名.py 文件路径 -Li ...
- zepto 源码 $.contains 学习笔记
$.contains(parent,node) 返回值为一个布尔值 ==> boolean parent,node我们需要检查的节点检查父节点是否包含给定的dom节点,如果两者是相同的节点,返 ...
- uiautomatorviewer报错“Error taking device screenshot: EOF” ,
uiautomatorviewer报错“Error taking device screenshot: EOF” ,千万不要装手机助手,不要装手机助手,不要装手机助手 uiautomatorview ...
- POI导入和导出Excel总结
POI导入和导出Excel总结 POI使用总结 1.POI读取Excel 打开工作簿的方式有以下两种简单的应用,POI读取和输出工作簿文件都可以通过以下两种方式来声明: //通过输入流的方式打开本 ...
- javascript_01
- Verilog有符号数处理
内容主要摘自以下两个链接: https://www.cnblogs.com/LJWJL/p/3481995.html https://www.cnblogs.com/LJWJL/p/3481807 ...
- asp.net 抽象方法和虚方法的用法区别,用Global类重写Application_BeginRequest等方法为例子
不废话,直接贴代码 public abstract class LogNetGlobal : System.Web.HttpApplication { protected void Applicati ...
- 基于IP的docker private registry 私有仓库的搭建
鉴于国内的网络环境,如果公司内部大量使用docker,镜像上传下载将是个非常耗时的工作,搭建一个私有仓库可以很好的解决自有镜像的存储,如果你在私有网络,不能使用域名的话,那么本文可以作为一个很好的例子 ...
- 【收藏】JS获取鼠标的X,Y坐标位置
JS的方法: <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- bzoj3110(整体二分)
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...