一,泛型
泛型能解决的问题------代码复用,比如
//不适用泛型,两个类虽然代码结构即功能都相同,但是由于类型不一样,不能复用代码
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){
}