泛型
泛型的本质就是"参数化类型"。一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化
参数化类型 不确定操作的元素是什么类型 假设为X即可
Java泛型也是一种语法糖,在编译阶段完成类型的转换的工作,避免在运行时强制类型转换而出现ClassCastException,类型转化异常。
泛型就是定义一种模板,例如ArrayList<T>
,然后在代码中为用到的类创建对应的ArrayList<类型>
:
ArrayList<String> strList = new ArrayList<String>();
实现了编写一次,万能匹配,又通过编译器保证了类型安全:这就是泛型。
泛型类
- 泛型类概述:把泛型定义在类上
- 定义格式:
public class 类名 <泛型类型1,...> {
}
public class GenericsClassDemo<T> {
//t这个成员变量的类型为T,T的类型由外部指定
private T t;
//泛型构造方法形参t的类型也为T,T的类型由外部指定
public GenericsClassDemo(T t) {
this.t = t;
}
//泛型方法getT的返回值类型为T,T的类型由外部指定
public T getT() {
return t;
}
}
泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候确定泛型的具体数据类型。即:在创建对象的时候确定泛型。
泛型方法
泛型方法,是在调用方法的时候指明泛型的具体类型 。
-
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public <T> T genercMethod(T t){ System.out.println(t.getClass()); System.out.println(t); return t; } public static void main(String[] args) { GenericsClassDemo<String> genericString = new GenericsClassDemo("helloGeneric"); //这里的泛型跟下面调用的泛型方法可以不一样。 String str = genericString.genercMethod("hello");//传入的是String类型,返回的也是String类型 Integer i = genericString.genercMethod(123);//传入的是Integer类型,返回的也是Integer类型 }
泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。
修饰符 interface接口名<代表泛型的变量> { }
public interface GenericsInteface<T> {
public abstract void add(T t);
}
泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查;
注意泛型的继承关系:可以把ArrayList<Integer>
向上转型为List<Integer>
(T
不能变!),但不能把ArrayList<Integer>
向上转型为ArrayList<Number>
(T
不能变成父类)。