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

  

posted @ 2015-04-08 20:42  Birding  阅读(252)  评论(0编辑  收藏  举报