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() ; // 出来时编译器自动插入强制类型转换代码
}
}