Java包装类与泛型

1.什么是包装类

首先应该知道Java有基本类型与非基本类型
基本类型包含四类八种:
整型:
int
long
short
byte
浮点型:
double
float
布尔型:
boolean
字符型:
char
基本类型在Java语言中的地位很高,是关键字差不多一级的。
每一个基本类型都有自己的包装类:
Integer
Long
Short
Byte
Double
Float
Boolean
Character

@Test
public void method(){
System.out.println(int.class.getName());
System.out.println(Integer.class.getName());
System.out.println(boolean.class.getName());
System.out.println(Boolean.class.getName());
System.out.println(double.class.getName());
System.out.println(Double.class.getName());
System.out.println(float.class.getName());
System.out.println(Float.class.getName());
System.out.println(long.class.getName());
System.out.println(Long.class.getName());
System.out.println(byte.class.getName());
System.out.println(Byte.class.getName());
System.out.println(short.class.getName());
System.out.println(Short.class.getName());
System.out.println(char.class.getName());
System.out.println(Character.class.getName());
}
int
java.lang.Integer
boolean
java.lang.Boolean
double
java.lang.Double
float
java.lang.Float
long
java.lang.Long
byte
java.lang.Byte
short
java.lang.Short
char
java.lang.Character

2.为什么需要包装类

在Java中,面向对象编程的思想中,一个方法应该尽可能的抽象。
比如我写一个方法,只能处理int类型的数据。
另一个方法能够处理所有整形的数据。
还有一个方法能够处理任意类型的数据。
那么第三种方法的抽象程度就比较高,使用的范围就大,使用的地方就会多。
那么如何表示任意类型呢?
有人说可以用Object类型。
是,所有的类都是Object类的子类。
但是,如果是基本类型呢?基本类型与Object可不是同一类。
所以,为了解决这一个问题,jdk就封装了所有的包装类,每一个基本类型对应一个包装类。
同时因为包装类支持对自己对应的基本类型的自动装箱,所以实际在使用的时候基本上无法对int与Integer的自动装箱做出感知。
例子:

@Test
public void method1(){
int i = 3;
System.out.println((Object)i);
}

编译为class文件后,使用反编译软件进行查看:

@Test
public void method1() {
int i = 3;
System.out.println(Integer.valueOf(i));
}

可以看到Integer对int做了自动的装箱。
有自动装箱就有自动拆箱

@Test
public void method2(){
Integer mInteger = 3;
System.out.println((int) mInteger);
}

编译后class文件:

@Test
public void method2() {
Integer mInteger = Integer.valueOf(3);
System.out.println(mInteger.intValue());
}

可以看到自动装箱是通过包装类的valueOf方法实现,自动拆箱通过intValue实现。
所以,使用上述方法可以实现手动装箱与拆箱。

所以,包装类的存在的第一个原因就是为了统一基本类型与Object的关系,通过包装类弱化基本类型的特殊性。

对于抽象的方法,如果使用Object对象作为参数,那么实际方法实现的时候需要使用instanceof来判定实例对象所属的类,然后使用强类型转换转换为需要的类。因为对将要处理的类的不确定性,此方式无法适应所有的类,只能兼容有限的类,而且对于开闭原则非常不友好,所以jdk在1.5版本中新增了泛型。
泛型的本质就是对任意一个类的实例进行如下处理:
1.声明方法的参数类型为Object,
2.使用时参数为任意类型,因为基本类型的自动装箱的存在,所有的类型都是Object的子类,
3.编译器自动进行类型转换。
所以,泛型就是对类型的擦除。

所以包装类存在的第二个原因就是为了支持泛型。

泛型与上界限定符有一定的相似之处: