一、问题引入
如果需要产生多个对象,每个对象逻辑一样,只是对象内的成员变量类型不同,如何做?
创建多个类,给每一个类成员设置指定数据类型
缺点:会导致类的膨胀,重用性太差
class Cls1{
int a;
public Cls1(int a){
this.a = a;
}
public int getData(){
return a;
}
}
class Cls2{
String a;
public Cls2(String a){
this.a = a;
}
public String getData2(){
return a;
}
}
public class Test {
public static void main(String[] args) {
Cls1 c1 = new Cls1(10);
System.out.println(c1.getData());
Cls2 c2 = new Cls2("xiao");
System.out.println(c2.getData2());
}
}
/*
10
xiao
*/
创建一个类,给这个类成员变量设置Object数据类型
缺点:编译正常,运行时可能会异常
class Cls3{
Object a;
public Cls3(Object a){
this.a = a;
}
public Object getData(){
return a;
}
}
public class Test {
public static void main(String[] args) {
Cls3 c1 = new Cls3(10);
System.out.println(c1.getData());
Cls3 c2 = new Cls3("xiao");
System.out.println(c2.getData());
System.out.println((Integer)c2.getData());//编译正常,运行异常
}
}
针对以上2个的缺点,就引用了泛型
class Cls3{ //,T可以是任何字母,不固定
T a;
public Cls3(T a){
this.a = a;
}
public T getData(){
return a;
}
}
public class Test {
public static void main(String[] args) {
Cls3<Integer> c1 = new Cls3<Integer>(10); //泛型使用的时候在<>里加入数据类型
System.out.println(c1.getData());
Cls3<String> c2 = new Cls3<String>("xiao");
System.out.println(c2.getData());
}
}
二、泛型简介(JDK1.5后引入)
泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的
泛型的原理就是“类型的参数化",即把类型看做参数。也就是说把所要操作的数据类型看做参数,就像方法的形式参数是运行时传递的值的占位符一样
简单的说,类型变量扮演的角色就如同一个参数,它提供给编译器用来类型检查的信息
泛型可以提高代码的扩展性和重用性