`
韩悠悠
  • 浏览: 841950 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

泛型讨论------危害的解决

 
阅读更多

泛型的危害不是一个语言特性,我们必须明确这一点,而在在运行时

 

 

例如在List<T>这样的类型在运行时都替换成List,而普通的类型变量在未指定边界的情况下都将替换成Object类型

 

替换的代价是显而易见的,即在运行时不能显示的引用运行的操作,例如转型,instanceof和new表达式。因为所有关于参数类型的信息都被丢失了。

当我们创建了Foot<Cat> foot  = new Foot<Cat>();看起来好像拥有了参数的类型,但事实并非如此,其实它只是一个Object类型而已。

 

例子:

 

public class SimpleHolder{

	private Object obj;
	public void set(Object obj){
		this.obj = obj;
	}

	public Object get(){
		return obj;
	}

	public static void main(String[] args){

		SimpleHolder simple = new SimpleHolder();
		simple.set("item");
		String s = (String)simple.get();
	}
}

public Class SimpleHolder<T> {

	privatate T obj;
	public void set(T t){
		this. obj = t;
	}

	public T get(){
		return obj;
	}

	public static void main(String[] args){
		SimpleHolder<String> simple = new SimpleHolder<String>();
		simple.set("item");
		String s = simple.get();
	}
}

 

 

编译它们产生字节码是相同的,

由于所产生的get()和set()的字节码是相同的,所以在泛型中的所有动作都发生在边界处,对传递进来的值进行额外的编译器检测,并插入对传递出去的值的类型,所以:“边界是发生动作的地方”

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics