登录

去注册 忘记密码?

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

每日一问 | 当JVM遇到桥接方法,暴露出了什么?

鸿洋    2020-10-03 11:43   收藏

上次我们问了:

每日一问 | Java 泛型与接口碰撞出的火花!

不少同学认识到了,「桥接方法」解决了实现类与接口参数类型不匹配的问题。

那么我们再来看一个例子:

interface TestInter<T> {

    T getName(String name);

}

实现类:

class TestImpl implements TestInter<String> {
    @Override
    public String getName(String name) {
        return null;
    }
}

这次猜我的关注点在哪?

我们反编译一下TestImpl:

public java.lang.String getName(java.lang.String);
  descriptor: (Ljava/lang/String;)Ljava/lang/String;
  flags: ACC_PUBLIC


public java.lang.Object getName(java.lang.String);
  descriptor: (Ljava/lang/String;)Ljava/lang/Object;
  flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC

又看到了ACC_BRIDGE,ACC_SYNTHETIC,已知知识。

可以看到生成的两个方法,我们转成Java的展现形式:

  1. String getName(String str)
  2. Object getName(String str);

有没有觉得奇怪?

我贴张图,你就能看明白了:

这两个方法的方法名,参数均相同,只有返回值不同,在我们Java平时编写中是不允许的。

问题来了:

  1. 为何在这个场景下,允许「一个类中有方法名,参数均相同,只有返回值不同」两个方法?
  2. 既然class文件有两个getName,那么我们调用getName时,是如何确定调用的哪个方法呢?

自助提问入口:点击提交问题

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定