博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 容器 & 泛型:六、容器讲到为什么要使用泛型
阅读量:3685 次
发布时间:2019-05-21

本文共 1809 字,大约阅读时间需要 6 分钟。

ArrayList是集合类中无处不在的,泛型也是,泛型对集合类尤其有用。但是为啥要使用泛型?理解好了这个问题可以帮助理解相关的更多知识点。下面泥瓦匠以最简单的例子来验证这个问题。

一、泛型

泛型的目的是为了可以让更多不同类型的对象重用。没错,这样理解就太low。真正目的是为了在编译时找到bug,而不是在运行时。(编译时,指的是源代码翻译成机器识别的代码的时候。运行时,是指代码在机器中运行的时候。)泛型只存在编译时,理解这个可以帮助你更好的理解泛型。

这样,在编译时会比在运行时更容易地找到bug和修复。

二、实现没有泛型的简易版ArrayList

简易版的ArrList有个Obejct对象(因为是Object,我们可以add任意类型。)比如说,Integer 和 String的。代码如下:

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:

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

使用泛型代码如下:

package javaBasic.generic;/** * 简易版ArrayList */class ArrList
{ 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
arrList = new ArrList<>(); arrList.add(1);// arrList.add("1"); Integer objInt = arrList.getObj(); System.out.println(objInt); }}

这时候如果想用

arrList.add("1");

会发现:

这时候就是泛型大显身手的时候,也不用需要对属性 get 方法时的强制转换。其实,  Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。这里T就相当于Integer。

四、小结

泥瓦匠记忆宫殿

1、在编译时检查强类型

2、显示转换的消除(上面的Integer get省去)

3、更好地实现代码重用和泛型算法

4、使用泛型比那些杂乱的需要强制转换的Object代码具有更好的安全性和可读性。

Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。哈哈~下次说这个。

转载地址:http://aaodn.baihongyu.com/

你可能感兴趣的文章
Spring+SpringMVC+MyBatis的整合
查看>>
Eclipse安装Hibernate插件
查看>>
android-Activity间传递数据
查看>>
Android-Activity生命周期以及ListView学习
查看>>
Android-Service的生命周期
查看>>
Android-自定义控件的学习
查看>>
Android-Fragment了解
查看>>
Android-Handler初体验
查看>>
Android-Srvice服务
查看>>
Android-广播接收器(BroadcastReceiver)
查看>>
Android-强大的WebView
查看>>
Android-强大的酷特性 “ Widget “
查看>>
Android-网络与数据存储
查看>>
Android-使用SQLite数据库
查看>>
看了就会用的ajax
查看>>
Hibernate的增删改查
查看>>
Python爬虫—Scrapy框架
查看>>
关于创建 Scrapy框架时,项目中没有虚拟环境的问题
查看>>
Django REST Framework入门学习
查看>>
DRF开发RESTful API接口
查看>>