文章 > java基础 > Java泛型擦除的原理分析

Java泛型擦除的原理分析

头像

小妮浅浅

2021-03-24 15:50:52399浏览 · 0收藏 · 0评论

1、说明

在编译过程中,可以获得类型变量的信息。因此,set方法可以在编译器中进行类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,操作时的实际引用类型是Object类型。

为了恢复返回结果的类型,编译器在get后添加了类型转换。因此,在genericHolder.class文件main方法主体的第18行有类型转换的逻辑。这是编译器自动添加的。

因此,我们处理了泛型对象的读写位置,并对代码添加了限制。

2、实例

//GenericHolder.java
public class GenericHolder<T> {
    T obj;
    public T getObj() {
        return obj;
    }
    public void setObj(T obj) {
        this.obj = obj;
    }
    public static void main(String[] args) {
        GenericHolder<String> holder = new GenericHolder<>();
        holder.setObj("Item");
        String s = holder.getObj();
    }
}
 
//GenericHolder.class
public class GenericHolder<T> {
  T obj;
 
  public GenericHolder();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        
 
  public T getObj();
    Code:
       0: aload_0       
       1: getfield      #2                  // Field obj:Ljava/lang/Object;
       4: areturn       
 
  public void setObj(T);
    Code:
       0: aload_0       
       1: aload_1       
       2: putfield      #2                  // Field obj:Ljava/lang/Object;
       5: return        
 
  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class GenericHolder
       3: dup           
       4: invokespecial #4                  // Method "<init>":()V
       7: astore_1      
       8: aload_1       
       9: ldc           #5                  // String Item
      11: invokevirtual #6                  // Method setObj:(Ljava/lang/Object;)V
      14: aload_1       
      15: invokevirtual #7                  // Method getObj:()Ljava/lang/Object;
      18: checkcast     #8                  // class java/lang/String
      21: astore_2      
      22: return        
}

以上就是Java泛型擦除的原理分析,希望对大家有所帮助。更多Java学习指路:Java基础

关注公众号

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

底部广告图 底部广告图按钮