测试原因
在对泛型擦除机制的学习中,有一些困惑,因此做了几个实验来验证自己所学习的内容是否正确。
测试1
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
for (Object o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
输出结果
true
list1:
java.lang.String
java.lang.String
java.lang.Integer
list2:
java.lang.Integer
java.lang.String
java.lang.Integer
[23, 1234, 123]--[123, 1234, 123]
测试2
再次试验,假如取出的时候的类型不是Object
package generics;
import java.util.ArrayList;
import java.util.List;
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
//类型变化
for (String o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
输出
true
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
list1:
at generics.ErasedTypeEquivalence.main(ErasedTypeEquivalence.java:28)
java.lang.String
java.lang.String
测试3
package generics;
import java.util.ArrayList;
import java.util.List;
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
//类型变化
for (Integer o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
结果:编译不通过
结论
可以看到,泛型检查仅在使用泛型的方法中起作用。
泛型在ArraryList内部中获取不到而且在编译后就被擦除,而且传入的类型被替换为Object。
参考:《Java编程思想》