• 技术文章 >java >java基础

    Java泛型擦除的原理分析

    小妮浅浅小妮浅浅2021-06-08 10:09:04原创3175

    1、说明

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

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

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

    2、实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    //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 泛型擦除
    上一篇:java泛型接口怎么用 下一篇:Java如何创建类型实例

    相关文章推荐

    • Java中trim怎么用?• Java内存交互的规则• Java中Collection如何通过迭代器访问?• Java Collections工具类有哪些用法

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网