上一篇文章中,我们初步认识了泛型的概念以及用法,本篇文章我们具体来认识一下泛型是如何被使用的。
上篇文章中我们认识到:泛型(Generic Type)是把类型变量化。
它的底层原理是引用的向上转型是自然的。
然而 基本数据类型是无法使用泛型的,因此通过基本类型一一对应一个包装类型来解决。
包装类的基本认识
如果我们用到了一个类Byte,没有给包名的情况下默认在java.lang.Byte下。
下面概括一下基本类型所对应的包装类:
基本类型 | 包装类 |
byte | Byte |
short | Short |
int | Intger |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
由上面表格我们可以总结为除了int和character是全称,
其余基本类型的包装类只需要首字母大写即可。
值得注意的是,当用包装类处理基本类型之后,就是对象(引用)了,要按照对象的方式去使用。
以下知识我们基本了解即可:
将基本类型转换成包装类的过程即装箱(boxing)。
int a = 10;
//手动装箱
Integer i1 = new Integer(a);
Integer i2 = new Integer.valueOf(a);
//自动装箱
Integer i3 = a; //编译器会帮我们完成,直接转换为i3 = Integer.valueOf(a);
将包装类转换成基本类型的过程即拆箱(unboxing)。
Integer i = 10; //隐含使用了自动装箱的过程,因为常量10默认为int类型
int a = i.intValue(); //i是对象,调用对象下的intValue方法
int b = i; //大部分情况下编译器会自动拆箱,并不需要手动拆箱
如果一个表达式中既有基本类型,也有包装类型,编译器会进行自动拆箱,对齐成基本类型来运算。
Integer i = 10;
int a = 5;
//编译器则会将 i + a 转换成 i.intValue() + a;
以上时一个包装类和一个基本类型的情况,编译器会将包装类自动拆箱成基本数据类型后,再进行计算。那如果是两个包装类型呢???
Integer i1 = 10;
Integer i2 = 20;
//能直接使用==判断i1和i2是否相等吗?
//答案是不能
此时的i1和i2是对象(即引用),编译器不会自动拆。因为这里是判断两个引用是否相等(即两个引用是否指向同一个对象),而不是值的比较。
包装类中对应类型的工具静态方法
以下为官方文档中的介绍(以Integer为例):
Integer (Java Platform SE 8 ) (oracle.com)
小结
1.因为基本类型无法使用泛型,包装类型就是将基本类型转换成对象,即可以使用泛型;
2.只有int和char类型的包装类型需要特殊记忆(全称+首字母大写),其他基本类型只需要将首字母大写即可;
3.通常情况下,编译器会自动进行拆箱装箱的过程;
4.当基本类型和包装类进行运算时,编译器会进行自动拆箱,将包装类拆箱为基本类型后进行运算;
5.当两个包装类运算时,编译器无法进行拆箱,因为是两个引用之间的运算;
6.查阅方法时,建议使用官方提供的文档进行查阅。