// java编译器是通过先检查代码中泛型的类型,然后再进行类型擦除,
// 再进行编译的,变为原始类型。
// 擦除getValue()的返回类型后将返回Object类型,编译器自动插入Integer的强制类型转换
// 编译器把这个方法调用翻译为两条字节码指令:
// 对原始方法Pair.getValue的调用
// 将返回的Object类型强制转换为Integer
public void run() {
Pair pair=new Pair ();
pair.setValue(3);
Integer integer=pair.getValue();
System.out.println(integer);
}
//泛型类型
class Pair {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
//原始类型 擦除类型变量,并替换为限定类型(T为无限定的类型变量,用Object替换)。
class Pair {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
四、泛型方法
public class GenericMethod {
public static void print(List a) {
for (E i : a) {
System.out.println(i);
}
}
public static void main(String[] args) {
List objects = new ArrayList();
objects.add("11");
GenericMethod.print(objects);
}
}
五、一些细节
泛型类型引用传递问题
ArrayList arrayList1=new ArrayList
泛型类型变量不能是基本数据类型 因为当类型擦除后,ArrayList的原始类中的类型变量(T)替换为Object,但Object类型不能存储基本数据类型值。运行时类型查询 类型擦除之后,ArrayList只剩下原始类型,泛型信息不存在了。JVM看到的都是ArrayList。泛型在静态方法和静态类中的问题 泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数; 对象都没有创建,不能确定这个泛型参数是何种类型。List extends T>和List super T>之间的区别: List extends T>可以接受任何继承自T的类型的List List super T>可以接受任何T的父类构成的List数组不支持泛型
public class GenericTest {
public static void main(String[] args) {
Animal[] cats = new Animal[5]; //这里会报错!
Object[] animals = cats;
animals[0] = new Animal();
Cat cat = cats[0].get(); //假设可以泛型数组,这里获取到的就错了!
}
}
class Animal {
private T name;
}
class Cat{}
class Dog{}