一,泛型
泛型能解决的问题------代码复用,比如
//不适用泛型,两个类虽然代码结构即功能都相同,但是由于类型不一样,不能复用代码 class classA(){ private String field; public void fun(String a){}; } class classB(){ private int field; public void fun(int i){}; } //使用泛型,引入类型变量T,允许该类匹配多种类型 class classC<T>(){ private T field; public void fun(T t){}; }
其中,类型变量可以为T,K,V,其他字母也行,无所谓,约定俗成而已,E常用于集合框架里的元素
1,泛型类(泛型接口类似)
泛型类可以有一个或多个类型变量,总而言之,泛型类可以理解为普通类的工厂
public class classA<T>{}
public class classB<K,V>{}
2,泛型方法
类型变量放在修饰符(static等)后,返回类型前,可以定义再普通类或泛型类里
public class classA<T>{ private T field; //返回值为String public static <T> String fun(T t){} //返回值为泛型 public static <T> T fun2T t){} }
限定泛型边界
限定泛型边界,则只能限定在Number类型,新建String类型会报错
public class Test01<T extends Number > { private T field; public T getField() { return field; } public void setField(T field) { this.field = field; } public static void main(String[] args) { Test01<Integer> test01=new Test01<>(); test01.setField(10); System.out.println(test01.getField());//10 //报错:类型参数没有继承Number // Test01<String> test02=new Test01<String>(); } }
二,通配符
当泛型中的类型变量T(或其他)实例为具体类型时,即为泛型赋值了,主要用在变量,即泛型赋值不确定,多用于方法传参的变量
public class Test02<T> { public void fun(Test02<?> test02){ }