下面这个程序中T 类型不是被擦除了吗?为什么使用get ( ) 方法不需要类型装换? (不适用泛型的简单代码就需要加(String) 来实现类型转换)
擦除知识点在实际编程中体现的多吗?
代码如下:
public class GenericHolder<T> {
private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }
public static void main(String[] args) {
GenericHolder<String> holder =
new GenericHolder<String>();
holder.set("Item");
String s = holder.get();
}
}
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 holder = new SimpleHolder();
holder.set("Item");
String s = (String)holder.get();
}
}
1.首先,擦除通俗的说是指泛型标签是交给Javac编译器去执行的,并起作用的。 代码过完编译期,运行期间就不管了《T》,在class文件找不到T了。 这里你显示了指明了类型是,那么编译器会在编译期间将GenericHolder中持有的T转换成String类型。 所以你的get不用转型了(编译器已经把String识别出来了)。
2.擦除是泛型中很重要的概念,可以说不懂擦除就不懂泛型。实际工作中有常见有关联的是对象的序列化反序列化,如gson等框架中会用到。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。