Java泛型(generics)是DK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。
泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。
如我们经常使用的ArrayList中的使用E表示泛型的形参,需要我们传递指定实际的类型。
如果不指定默认是Object类型,Object不能强转为其本身的子类型,所以出现java.lang.Object无法转换为java.lang.String。
1、泛型类的定义语法
2、常用的泛型标识:T、E、K、V
泛型标识可以作为成员变量的类型定义标识和函数的返回类型标识和成员方法的参数类型标识。
class Test{ //T创建对象的时候指定数据类型private T a;public T getA(T b){return a;}}//具体的实现如下:Test t = new Test<>();//使用Integer类型指定 T 具体是什么
3、 泛型类相关知识
1、子类是泛型类
父类是泛型类,子类也是泛型类,子类中的泛型变量要有一个和父类的泛型要保持一致
class Test{private T a;public T getA(T b){return a;}
}class Son1 extends Test{ //如果父类是泛型类,子类要有一个泛型变量和父类保持一致
}
class Son2 extends Test{ //报错:不保持一致会报错
}
2、子类不是泛型类
子类不是泛型类,父类要明确泛型的数据类型
class Test{private T a;public T getA(T b){return a;}
}class Son1 extends Test{ //子类不是泛型类,父类要明确泛型的数据类型
}
class Son2 extends Test{ //报错:需要明确父类的泛型数据类型
}
泛型接口的定义语法
interface Test{T get(T a);
}
class Son1 implements Test{@Overridepublic T get(T a) {return null;}
}
class Son2 implements Test{@Overridepublic String get(String a) {return null;}
}
class Son3 implements Test{//如果不写的话,默认的T就会变成Object@Overridepublic Object get(Object a) {return null;}
}
举例如下:
class Test1{public T geta(T a){return a;}
}
public class Main {public static void main(String[] args) {Test1 test1 = new Test1();Integer geta = test1.geta(1);//根据传入参数的类型指定泛型形参}
}
反向方法的可变参数
泛型方法总结:
类型通配符一般是使用?代替具体的类型参数,所以类型通配符是类型实参.
? extends Number,表示的是类型通配符的上线是Number
class Test1{public void get1(){}
}
public class Main{public static void main(String[] args) {get(new Test1<>());get1(new Test1());}public static void get(Test1> test1){test1.get1();}public static void get1(Test1 extends Number> test1){test1.get1();}
}
采用super关键字 ? super Number表示类型最低是Number
class Test1{public void get1(){}
}
public class Main{public static void main(String[] args) {get(new Test1<>());get1(new Test1());}public static void get(Test1> test1){test1.get1();}public static void get1(Test1 super Number> test1){test1.get1();}
桥接方法
因为在编译的时候,为了保证实现类重写了接口的方法,虽然实现类有了Integer的方法,但是在泛型擦除的时候会在实现类中生成一个Object的方法。
public static void main(String[] args) {ArrayList[] a = new ArrayList[4]; //错误案例ArrayList[] b = new ArrayList[4];//创建数组}
class Test1{private T[] arr;public Test1(Class clz,int len){ //创建数组arr = (T[]) Array.newInstance(clz,len);}public void put(int index, T item){arr[index]=item;}
}
public static void main(String[] args) throws Exception {Class test1Class= Test1.class;Constructor constructor = test1Class.getConstructor();Object o = constructor.newInstance();}
反射常用的泛型类
Class
Constructor
Written By 知识浅谈Pro