`

泛型的深度进展

    博客分类:
  • java
 
阅读更多


今天需要实现根据类得到类的泛型的type,实现过程总是报错,就去看了下泛型,写了简单的实例:

这里声明的是Integer类型,但是引用是A a,即没有确定是类型;在初始化类的时候有个类型擦除(type erasure)。 即初始化结束后T没了  但又不能没有返回值或者对象类型,所有就初始化成Object类型;
public void setmethod(Object  ba){
		 this.bb=ba;
	}

所以这里18、19行有警告。有时候会出现castclassexception。


这里A<Integer> a已经申明是Integer,所有编译器检查的时候就会对传入的的检查。而传入的是String的,所以报错,编译不通过。

public  class A<T> {
	public A() {
		// TODO Auto-generated constructor stub
	}
	T bb;
	public void setmethod(T  ba){
		 this.bb=ba;
	}
	public T getmethod(){
		String ss="fhdskaj";
		return (T)ss;
	}
	
	public static void main(String[] args) {
		A<Integer> a= new A<Integer>();
		a.setmethod(11);
		System.out.println(a.getmethod());
	}
	
}

这里编译通过,在初始化后T泛型被擦除,由jvm分配合适的类型(object);
public T getmethod(){
		String ss="fhdskaj";
		return (T)ss;
	}

这里的T被擦除成Object的类型,而编译的时候T不知道是什么类型,ss是String类型,不一定错,所以编译器只是警告。而运行后这里被擦除,Object的类型了,所以string自动转化成了object了,输出string。

文献:http://www.infoq.com/cn/articles/cf-java-generics
  • 大小: 7.3 KB
  • 大小: 8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics