泛型的好处
1、不需要强制转换类型
泛型中的类型,在使用时才会指定,避免了运行时取数据异常
2、多种数据类型可以执行相同逻辑的代码
泛型接口
public interface GenericInterface<T> {
public T getParam();
}
// 实现,指定了具体的类型,如String
public class GenericImpl implements GenericInterface<String> {
@Override
public String getParam() {
return "test";
}
}
泛型类
public class GenericClass<T> {
public T param;
// 普通方法,参数是泛型
public void setParam(T param) {
this.param= param;
}
// 普通方法,返回值是泛型
public T getParam() {
return this.param;
}
/**
* 泛型方法
* 在修饰符和返回值之间必须有<T>,代表定义了T类型,此T可以是任意类型(它可以与本类中定义的T不一样)
* 调用的时候需指明类型,如 mGenericClass.getName("marry");
*/
public <T> T getName(T a) {
return a;
}
}
// 使用
GenericClass<TestBean> mGenericClass = new GenericClass<>(); // 指定具体类型
TestBean testBean= new TestBean();
testBean.setParam(testBean);
testBean2 = mGenericClass.getParam();
// 可见,泛型方法里定义T与GenericClass里定义的T可以不同
String a = mGenericClass.getName("aaa");
补充点:
1、实例化类型时,不能用基本类型
// GenericClass<int> mGenericClass = new GenericClass<>(); // int不行,编译都通不过
GenericClass<Integer> mGenericClass = new GenericClass<>(); // 用包装类
2、泛型类里的T可以限定类型
public class GenericClass<T extends TestBean> {
...
}
3、静态域不能引用泛型
泛型是在对象创建时指定类型,而代码的执行顺序是,先执行static部分,再执行构造函数、类对象初始化等等。因此在静态域引用泛型时,JVM不会指定这是什么类型。
这里的静态域包括静态变量、静态方法、静态模块等,但是用static修饰的泛型方法是可以的。