泛型类
- 泛型的参数不支持基本类型
- 泛型相关的信息不会进入到运行时阶段
在编译过程中,正确检验泛型结构后,JVM会将泛型的相关信息擦除,并在对象进入和离开的边界处添加类型检查和类型转换的方法,即不会进入运行时阶段,例如
GenericClasExample<String> stringExample = new GenericClasExample<String>("abc");
GenericClasExample<Integer> integerExample = new GenericClasExample<Integer>(123);
System.out.println(stringExample.getClass());
System.out.println(integerExample.getClass());
输出为
class demo.genreric.GenericClasExample
class demo.genreric.GenericClasExample
两个类型一致,意味着泛型的类型约束只在编译的时候有效,对比编译前和编译后的结果。
下面开始验证,使用javac编译文件
可以看到输出了两个class文件,idea支持直接打开,打开后发现以及没有了泛型的相关信息。
package demo.generic;
public class GenericDemo {
public GenericDemo() {
}
public static void main(String[] var0) {
GenericClasExample var1 = new GenericClasExample("abc");
GenericClasExample var2 = new GenericClasExample(123);
System.out.println(var1.getClass());
System.out.println(var2.getClass());
}
}
能否在泛型中使用具备继承关系的类?
能,有三种方法
- 使用通配符
?
,但是会使得泛型的类型检查失去意义
public static void handleMember(GenericClasExample<?> integerGenericClasExample){
Integer result = 111 + (Integer) integerGenericClasExample.getMemeber();
System.out.println("result is" + result);
}
这种做法虽然让泛型满足拥有继承关系的数据类型,但是通配符?
将不具备继承关系的数据类型也支持了,和引入泛型的目的是相悖的,容易产生类型转换异常。
- 给泛型加入上边界
?extends E
,给通配符引入继承的上边界限制,该语义表示泛型的实参的父类必须是E
,将错误在暴露在编译期间,这里在设置上边界时注意不应过于上层。 - 给泛型加入下边界
?super E
,该语义表示该泛型的实参的子类必须是E
。
泛型接口
泛型接口的实现类的泛型形参必须与泛型接口的泛型形参一致。
泛型方法
既能用在泛型类、泛型接口里,也能用在普通类或者接口里
public static <E> void printArray(E[] inputArray){
for (E element:inputArray){
System.out.println("%s",element);
System.out.println(" ");
}
System.out.println();
}
泛型方法与泛型类中的方法的区别是:泛型方法需要泛型标识符,而泛型类中的方法不带泛型标识符,属于普通方法。
使用泛型方法:
Integer[] integers ={1,2,3,4,5,6};
Double[] doubles ={1.1,2.2,3.3,4.4,5.5,6.6};
Character[] characters = {'A','B','C'};
stringExample.printArray(integers);
stringExample.printArray(doubles);
stringExample.printArray(characters);
泛型方法中的E的标识符并不受制于T,而泛型类中的方法的返回值和参数类型必须为泛型类传入的实参类型。
注意:泛型方法中的泛型标识符能和泛型类一样,但是在使用时可以传入和泛型类型不同的实参,即独立于泛型类实参。
泛型字母的含义
- E-Element:在集合中使用,因为集合中存放的是元素
- T-Type:Java类
- K-Key:键
- V-Value:值
- N-Number:数值类型,包括double,long,integer