目录
一.定义
一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。
二.目的
泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
三.语法
<...> 闭合的尖括号 —— Java中泛型的特征。
泛型可以是类,也可以是方法。
1.类
(1).定义
a.直接定义
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}
b.继承
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}
(2).泛型类的使用
泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
示例:
MyArray<Integer> list = new MyArray<Integer>();
注意:泛型只能接受引用类型,所有的基本数据类型必须使用包装类!
2.方法
方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
对于初学者来说,重点在于学会如何使用别人定义好的泛型类(Iterable,Collection,List)。
三.注意
1.泛型Object类
Object是所有类(包括接口)的祖先类。
知识点:通过上层引用可以指向下层对象。
具体讲解:Object类的介绍
2.作用范围
Java的泛型只在编译阶段起作用。
3.有关于包装类的使用(装箱和拆箱)
Java的泛型只支持引用,不支持基本类型(基本类型需要转为包装类)。
基本数据类型 | byte | short | int | long | float | double | char | boolean |
对应的包装类 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
注意:包装类类型已经是对象,不能使用 "==" 比较, 应该使用 equals 进行比较。
包装类和基本数据类型的转换——通过拆箱和装箱实现
(1).拆箱
将包装类转换为基本数据类型。
(2).装箱
将基本数据类型转换为包装类。
示例:
int a=1;
Integer ai=new Integer(1);
a=ai.intValue();//unboxing a=ai; 拆箱
ai=Integer.valueOf(a);//boxing ai=a; 装箱
四.有关类型转换的例题
eg1
有以下类型转换:
X类型 a;
Y类型 b;
a=b;
问:符合语法不报错,请问X类型和Y类型之间可能是哪些情况?
1.X和Y是同一个类型。
2.都是基本类型,但X类型表示的数据范围>Y类型表示的数据范围。
double>float>long>int>char>short>byte
3.X类型和Y类型都是引用类型,X类型是Y类型的上级类型。
a.X是一个接口,Y是一个类,Y实现了X接口
b.X是一个接口,Y也是一个接口,Y继承自X接口
c.X是一个类,Y也是一个类,Y继承自X类
4.自动拆箱和自动装箱。
以上情况,都是可以直接赋值的,除此之外都是语法错误。
eg2
有以下类型转换:
X类型 a;
Y类型 b;
a=(X)b;
问:符合语法不报错,请问X类型和Y类型之间可能是哪些情况?
1.eg1的情况都可以。
2.基本类型:可以,如果从大范围强制到小范围,可能存在精度的丢失。
3.引用类型:必须在继承链上,从上往下转。
如有建议或想法,欢迎一起交流学习~