泛型(generic)
特点:
【1】泛型允许开发者在强类型程序设计语言(java)编写代码时定义一些可变部分,这些部分在使用前必须作出指明
【2】泛型在编译器起作用,运行时jvm察觉不到泛型的存在。
1 泛型的擦除
【1】泛型在运行时已经被擦除了。
2 泛型类
【1】当一个类中属性的数据类型不确定时,具体是什么类型由使用者来确定时,使用泛型。泛型类的形式
public class FanClass<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } public FanClass(T t) { super(); this.t = t; } public FanClass() { super(); } }
3 泛型方法
【1】当一个方法的参数类型不确定时,具体是什么类型由使用者来确定,可以考虑使用泛型方法。
【2】泛型方法在调用时确定(指明)类型。
【3】泛型方法在一定程度上优化了方法重载。
public <T> void xxx(T a) { System.out.println(a); }
【4】多个泛型类型进一步优化了方法重载。
// 多个同类型的泛型 /*public <A> void print(A a) { System.out.println(a); } public <A> void print(A a,A b) { System.out.println(a); System.out.println(b); }*/ public <A> void print(A...a) { System.out.println(a); }
4 泛型接口
【1】如果接口中的方法的参数(形参、返回值)不确定时,可以考虑使用泛型接口。
public interface FanInterface<T> { public void showInfo(T t); } public interface FanInterface<T> { public void showInfo(T t); }
【2】实现类能确定泛型接口的类型
public class ImplClass implements FanInterface<String>{ @Override public void showInfo(String t) { // TODO Auto-generated method stub } }
【3】实现类不能确定泛型接口的类型->继续泛。
public class ImplClass2<T> implements FanInterface<T>{ @Override public void showInfo(T t) { } }
4 泛型的上限和下限
【1】泛型的上限ArrayList(? extends Pet) list 声明了一个容器,容器中的元素类型一定要继承于Pet,我们称这种形式叫做泛型的上限。
【2】泛型的下限ArrayList(? super Pet) list 声明了一个容器,容器中的元素类型一定要是Pet的父类,我们称这个形式为泛型的下限。