一、为什么要用泛型
1)宽泛数据的限制; 默认的类型是Object,太宽泛了,但是你在使用的时候还想使用一个具体的引用数据类型;
2)语法格式: <引用数据类型>
3)优点: 使用泛型时,会提前把问题在编译时显示; 避免了类型转化,代码可读性更强;
二、泛型的使用
泛型是先做定义,在使用的时候再设置数据类型;
1)泛型类 自定义泛型类的定义: 语法格式: 访问修饰符 class 类名<T>{}
2)泛型方法 语法格式: 权限修饰符<代表泛型的变量> 返回值类型 方法名(T 参数){} eg: public <T> void sendMessage(T obj) {//T可以代替任意类型; 代码块; }
3)泛型接口 接口语法格式: 访问修饰符 interface 接口名<代表泛型的变量>{}
实现类语法格式:
使用情况1:已经知道是什么类型; public class MyComparable implements MyComparableInterface<String> {//这里设置成需求数据类型; 代码块; }
使用情况2:定义时不知道是什么类型; 实现类: public class InterImpl<T> implements Inter<T> {}
测试类语法格式: 直接实例化对象;如果在实现类中已经定义了类型,则在测试类实例化对象时不需也不能再加泛型; eg: MyComparable mc=new MyComparable(); System.out.println(mc.compareTo("123"));
三、泛型通配符
<?> //类型不确定;
<? extends E> //表示 ?属于E的子类型(包含E类型);
<? super E> //表示 ? 是E的父类型(包含E类型);
四、代码演示
篇幅原因,只演示泛型类;
定义一个泛型的类:
package test.generictype.testclass;
public class FanXing<T> {
private T obj;
public FanXing() {
}
public FanXing(T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
@Override
public String toString() {
return "FanXing{" +
"obj=" + obj +
'}';
}
}
测试类:
你可以自己设定要添加在实例化对象中的数据类型,此处是给成员变量obj赋值,体现处泛型的方便之处,无需在封装的类中指定成员变量的数据类型;在测试类中根据需要自己设定要存入的数据类型;
package test.generictype.testclass;
public class TestFanXing {
public static void main(String[] args) {
//泛型
FanXing<String> fx=new FanXing<>();
fx.setObj("Hello Java");
fx.setObj("666");
System.out.println(fx.getObj());
FanXing<Integer>fx1=new FanXing<>();
fx1.setObj(123456);
System.out.println(fx1.getObj());
}
}
结果: