泛型的优点:
1、数据安全
2、获取数据时效率比较高
泛型的高阶应用:
1、泛型类:在定义类的时候在类名后添<E、K、V、A、B>起到占位作用,类中的方法的返回值类型和属性类型都可以使用
public class FanXingClass<A> {
private int id;
private A a;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
void show(){
System.out.println("id:"+id+",A:"+a);
}
}
public class FanXingDemo {
public static void main(String[] args) {
FanXingClass<String> fanXingClass = new FanXingClass<String>();
fanXingClass.setA("小明");
fanXingClass.setId(2);
fanXingClass.show();
FanXingClass<Integer> fanXingClass1 = new FanXingClass<Integer>();
fanXingClass1.setA(28);
fanXingClass1.setId(1);
fanXingClass1.show();
FanXingClass<Person> fx3 = new FanXingClass<Person>();
fx3.setA(new Person("小明",36));
fx3.setId(5);
fx3.show();
}
}
2、泛型接口:在定义接口的时候,在接口的名称后添加<E、K、V、A、B>。
子类在进行实现的时候,可以不填写父类的泛型类型,在创建具体的子类对象的时候才决定使用什么类型
子类在实现泛型接口的时候,只在实现父类的泛型接口的时候指定父类的泛型类型即可,此时,测试方法中的泛型类型必须要跟子类保持一致
public class FanXingInterfaceSub implements FanXingInterface<String> {
@Override
public String test() {
return null;
}
@Override
public void test2(String o) {
System.out.println(o);
}
}
FanXingInterfaceSub fxi = new FanXingInterfaceSub();
fxi.test2("abc");
3、泛型方法:在定义方法的时候,指定方法的返回值和参数是自定义的占位符,可以是类名中的T,也可以是自定义的Q,只不过在使用Q的时候需要< Q>定义在返回值的前面
public class FanXingMethod<T> {
private T t;
public <Q> void show(Q q){
System.out.println(q);
System.out.println(t);
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
FanXingMethod<String> fxm = new FanXingMethod<String>();
fxm.setT("niho");
fxm.show(19);
fxm.show(true);
4、泛型的上限:如果父类确定了,所有的子类都可以直接使用
5、泛型的下限:如果子类确定了,子类的所有父类都可以以直接传递参数使用