首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试题3:什么是类型擦除和桥接方法?

面试题3:什么是类型擦除和桥接方法?

作者头像
爪哇缪斯
发布于 2023-05-09 21:32:42
发布于 2023-05-09 21:32:42
4820
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

一、类型擦除

  • 泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,阻止向集合中插入非法数据。
  • 但编译器编译完带有泛型的java程序后,生成的class文件中将不再带有泛型信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
  • 我们可以利用反射,看一下Cat类都有哪些方法。示例代码如下:

【解释】我们可以看到多了一个eat(Object s)方法,该方法就是虚拟机自动给我们生成的桥接方法。

  • 那泛型的类型被擦除了,怎么保障泛型对于类型的限制呢?

答:采用桥接方法。

二、桥接方法

  • 什么是桥接方法? 由于类型被擦除了,为了维持多态性,所以编译器就自动生成了桥接方法。
  • 最初的代码:
代码语言:javascript
复制
public class Node<T> {
    public T data;
    public void setData(T data) {
        this.data = data;
    }
}

public class MyNode extends Node<Integer> {
    @Override
    public void setData(Integer data) {
    }
}
  • 擦除(把<Integer>擦除了)和桥接后的代码
代码语言:javascript
复制
public class Node {
    public Object data;
    public void setData(Object data) {
        this.data = data;
    }
}

public class MyNode extends Node {
    public void setData(Integer data) {
      super.setData(data);
    }
  
    // 桥接方法,被编译器自动生成
    @Override
    public void setData(Object data) {
      setData((Integer) data);
    }
}
  • 桥接方法在Mybatis中的影子
  • 桥接方法在Spring中的影子
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档