1.泛型是JDK1.5引入的新特性,也是最重要的一个特性
2.泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的
3.泛型的原理就是“类型的参数化”,即把类型看做参数。也就是说把所要操作的数据类型
看做参数,就像方法的形式参数是运行时传递的值的占位符一样。
4.简单的说,类型变量扮演的角色就如同一个参数,它提供给编译器用来类型检查的信息
5.泛型可以提高代码的扩展性和重用性
6.泛型的作用及其引出: 如果我们需要产生多个对象,每个对象的逻辑完全相同,知识对象内的成员变量的
类型不同,那么我们如何去做? 方法1,创建多个类文件,给每个类终端成员变量设置指定的数据类型
,但这种方式会导致类的膨胀,重用性太差 方法2,创建一个类文件,给这个类总的成员变量设置Object
型的数据类型, 这种方法虽然编译的时候正常,但运行的时候可能会产生异常(类型转换错误),如何解决
以上2个问题————使用泛型类,可以很好的解决以上2个问题
7.所以泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程时一种编程范式,
它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用
8. 实例-泛型类
public class GenClass <T> { //T代表了一个数据类型
// 当使用了这个类来创建对象时,要传递一个数据类型作为参数,比如int类型,String类型,
//这个参数就可以在类里面的任意地方被使用
T可以认为是代表一个变量名,用来接收这个类构造对象时传递过来的数据类型
private T obj; //可以作为属性的数据类型
public GenClass( T job) { //可以作为方法的形参的数据类型
this.obj = obj;
}
public T getObj() { //可以作为方法的返回值类型
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
9. 泛型类的几个特性:
(1)泛型的类型参数(也就是<T>)可以是泛型类
(2)泛型类可以同时设置多个类型参数
(3)泛型类可以继承泛型类
(4)泛型类可以实现泛型接口
10.限制泛型可用类型:
(1)在定义泛型类别时,默认在实例化泛型类的时候可以使用任何类型,但是如果想要限制使用泛型类型
时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends
关键字指定这个类型必须是继承某个类,或者实现某个接口
(2)当没有指定泛型继承的类型或者接口时,默认使用extends Object,所以默认情况下任何类型
都可以作为参数传入,比如class SuperClass<T1> ,T1之所以可以接收任何类型,是因为
class SuperClass<T1>等价于 class SuperClass<T1> extends Object
11.类型通配声明:
同一泛型类,如果实例化时给定的实际类型不同,则这些实例的类型是不兼容的,不能相互赋值
如: Generic<Boolean> f1 = new Generic<Boolean>();
Generic<Integer> f2 = new Generic<Integer>();
创建了两个不同类型的泛型类对象,如果使用语句f2=f1将f2赋给f1,编译时将发生错误
Generic<Object> f = f1; //f1和f类型不兼容,发生编译错误
f = f2; //f2和f类型同样不兼容,也会发生编译错误
如何解决这个问题?
12.泛型类实例之间的不兼容性会带来使用的不便,我们可以使用泛型通配符(?)来声明
泛型类的变量就可以解决这个问题。
13.泛型通配的方式:
(1) ?代表任意一个类型
示例: Generic<Boolean> f1 = new Generic<Boolean>();
Generic<?> f = f1; //表示,f可以引用任意类型参数的Generic泛型类所构造出来的对象
(2) 和限制泛型的上限相似,同样可以使用extends关键字限定通配符匹配类型的上限:
示例: Generic<Dog> f1 = new Generic<Dog>();
Generic<? extends Animal> f = f1;
//表示f可以引用Generic泛型类所构造出来的对象,也可以引用Animal的子类对应的Generic泛型类所构造出来的对象
(3)还可以使用super关键字将通配符匹配类型限定为某个类型及其父类型
示例: Generic<Animal> f1 = new Generic<Animal>(); //Animal是一个父类
Generic<? super Dog> f = f1;
//f可以引用类型参数为Dog的Generic这个泛型类所构造出来的对象,也可以引用类型参数为Dog的父类型的Generic这个泛型类所构造出来的对象
14.泛型方法使用场合:
什么时候使用泛型方法而不是泛型类呢 ?
(1)当添加类型约束只作用于一个方法的多个参数之间、
而不涉及到类的其他方法时,使用泛型方法
(2)施加类型约束的方法为静态方法,只能将其定义为泛型方法,因为静态方法不能使用其所在类的类型参数
例如: class A<T> {
private T a;
public static void a() {
System.out.println(a);
//这样写就不行了,如果要这样输出,在这个静态方法static关键字前面,增加<T>,也声明为泛型方法
}
}