Java泛型擦除的原理分析

美女程序员鼓励师

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基础

本教程操作环境:windows7系统、java10版,DELL G3电脑。

以上是 Java泛型擦除的原理分析 的全部内容, 来源链接: utcz.com/z/544026.html

回到顶部