Java通俗易懂讲解泛型_第1页
Java通俗易懂讲解泛型_第2页
Java通俗易懂讲解泛型_第3页
Java通俗易懂讲解泛型_第4页
Java通俗易懂讲解泛型_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java通俗易懂讲解泛型目录1.什么是泛型2.引出泛型3.泛型类的语法4.裸类型5.泛型如何编译的5.1擦除机制5.2.泛型数组为什么不能实例化6.泛型的上界7.通配符7.1.通配符能用来干嘛7.2.通配符的上界(读数据)7.3.通配符的下界(写数据)

1.什么是泛型

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

看到标红的这句话,有些兄弟可能会有疑惑,我们以前传参,传得是一个整形数据,传得是一个引用,我从来没传过类型嘛,类型难道还能作为参数传递???对,没错,接下来,我们就来看一下类型作为参数传递的实现方式

2.引出泛型

我们以前学过继承和多态,我们知道所有类的父类默认是Object类,我们现在目标是:数组中可以存放任何类型的数据,这时候我们就可以new一个Object类型的数组,,,

classMyArray{

publicObject[]array=newObject[10];

publicObjectgetPos(intpos){

returnarray[pos];

publicvoidsetPos(intpos,Objectvalue){

array[pos]=value;

publicclassTestDemo{

publicstaticvoidmain(String[]args){

MyArraymyArray=newMyArray();

myArray.setPos(0,1);

myArray.setPos(1,"hello");

}

当我们写出这样一个代码的时候,我们发现数组中什么元素都能放了,可以放整形数据,可以放字符串,还可以放小数,这里面能放的东西太多了,你能知道某个下标的元素是什么样的类型吗??当我们取元素的时候,会发现你的代码编译都不能通过,,,

为什么会出现这样的情况呢,我相信大部分兄弟们都知道,我们观察getPos的返回值是Object,也就意味着我们拿出来的可能是任意元素,但编译器知道吗???它只知道返回的是一个Object:这就很明显了,父类给子类,,这不纯纯的向下转型吗,向下转型就必须要强转类型,否则你的代码就不可能通过。

那么问题又来了,,我这里只是放了两个元素,肉眼还能看的过来,但是这里面的类型时刻在发生改变,就算你知道类型,你每次都需要强转吗,我是动态的啊,我代码是写死的啊,所以这个地方如果用Object去做的话,会显得格外麻烦,而且局限性非常的大

我们现在的困境有两个:

1.任何类型都可以放,不好控制,,,

2.每次取元素的时候,都得进行强制类型转换,,,

这时候我们得搞一手希望工程,我们的希望是:

1.我们能不能自己指定类型

2.我们能不能,不再进行类型转换呀,能不能把这一步省略呀,兄弟!!!

为了解决这一问题,我们java就引入了这个东西----》泛型

那到底怎么指定类型呢,来看代码:

classMyArrayT{

//publicObject[]array=newObject[10];

publicT[]array=(T[])newObject[10];//这样写也不好,待会说为什么??

publicTgetPos(intpos){

returnarray[pos];

publicvoidsetPos(intpos,Tvalue){

array[pos]=value;

publicclassTestDemo{

publicstaticvoidmain(String[]args){

//我指定放整形

MyArrayIntegermyArray=newMyArray();

//后面的尖括号里的类型可以省略,在实例化对象的时候根据前面可以做出判断

//MyArrayIntegermyArray=newMyArrayInteger

myArray.setPos(0,1);

myArray.setPos(1,2);

Integerret=myArray.getPos(1);

System.out.println(ret);

//我指定放字符串类型

MyArrayStringmyArray2=newMyArray();

myArray2.setPos(0,"abc");

myArray2.setPos(1,"bit");

Stringret2=myArray2.getPos(0);

System.out.println(ret2);

}

这个代码有几个注意事项:

1.尖括号里面只能放引用类型;

2.T是一个占位符,代表当前类是一个泛型类;

3.MyArrayIntegerarray=newMyArray();后面的尖括号可以省略Integer不写,实例化对象的时候编译器根据前面能做出判断。

看完上面的代码,我相信兄弟们已经明白是怎么一回事了吧

我们刚刚的希望工程也已经实现了

1.Integer,指定当前类中,使用的类型是Integer类型

2.泛型帮我在编译期间做了2件事情(目前为止的优点):

存放元素的时候,进行类型的检查取元素的时候,帮我进行类型的转换

3.泛型类的语法

有了刚刚知识的铺垫,这一块咱就形式化一下啦,,当然,语法还是很重要滴!!

语法:

泛型类类型实参变量名;//定义一个泛型类引用

new泛型类类型实参(构造方法实参);//实例化一个泛型类对象

栗子:

MyArrayIntegerlist=newMyArrayInteger

4.裸类型

说明:

兄弟们,咱学了新东西,这旧东西,咱也得了解一下是不咯,,万一以后跟别人聊到了,自己好像从来没听过就尴尬了,,

裸类型是一个泛型类但没有带着类型实参,例如MyArrayList就是一个裸类型

MyArraylist=newMyArray();

注意:我们不要自己去使用裸类型,裸类型是为了兼容老版本的API保留的机制

5.泛型如何编译的

5.1擦除机制

我用的是Powershell窗口查看的字节码文件,当然用idea的兄弟们也可以去下载一个展示字节码的插件,,接下来我们看看泛型到底是怎么编译的,,javap-c查看字节码

我们发现在编译期间,所有的T都被擦除为了Object,那既然所有的T都变成了Object,那我们为什要指定类型呢?注意这里不是编译的时候替换,指定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论