关于Java擦除特性
1 package thinkingInJava; 2 /* 3 * 模拟擦除 4 */ 5 public class SimpleHolder { 6 7 private Object obj ; 8 public void set(Object o ){ 9 obj = o ; 10 } 11 public Object get(){ 12 return obj ; 13 } 14 public static void main(String[] args) { 15 // 如果该类使用了泛型参数,并且这个obj变量类型就是这个泛型参数表示的类型,那么当构造这个类的对象的时候会自动擦除类型信息, 16 // 对于有非泛型上界的变量类型转换成对应的非泛型上界,没有指定的则转换成Object 17 SimpleHolder demo = new SimpleHolder() ; 18 // 在运行时编译器丢到了所有的类型信息,所以set方法参数即使使用了泛型也不会起作用, 19 // 而是将其转换成器非泛型上界,但是在对象进入时(通过泛型设置值)会判断这个对象与泛型的一致性 20 demo.set("xxx") ; 21 // 当然获取时也是获取的对应非泛型上界类型的值。但是编译器会自动插入强制类型转换的代码 22 String x = (String) demo.get() ; 23 } 24 }
package thinkingInJava; /* * 使用泛型版本 */ public class GenericHolder<T> { private T obj ; public void set(T t ){ this.obj = t ; } public T get(){ return obj ; } public static void main(String[] args) { GenericHolder<String> demo = new GenericHolder<String>() ; //demo.set(new Object()); 虽然在运行时丢到了所有的类型信息,但是编译器仍然会保证传递进去的参数与泛型一致 demo.set("hello ") ; String x = demo.get() ; // 出来时编译器自动插入强制类型转换代码 } }