为了账号安全,请及时绑定邮箱和手机立即绑定

Java泛型-桥接方法?

Java泛型-桥接方法?

幕布斯6054654 2019-10-08 15:31:35
与Java泛型相关的称为“桥接方法”的概念使我停下来思考一下。顺便说一句,我只知道它发生在字节码级别,我们无法使用。但是我很想知道Java编译器使用的“桥接方法”背后的概念。幕后到底发生了什么,为什么要使用它?任何有关示例的帮助将不胜感激。
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

如果您想了解为什么需要桥接方法,则最好了解没有它的情况。假设没有桥接方法。


class A<T>{

  private T value;

  public void set(T newVal){

    value=newVal

  }

}


class B extends A<String>{

  public void set(String newVal){

    System.out.println(newVal);

    super.set(newVal);

  }

}

请注意,擦除后,由于Type参数不受限制,因此setin中的方法A成为了。有类没有方法的签名,其中相同的。因此没有覆盖。因此,当发生这种情况时:public void set(Object newVal)TBsetA


A a=new B();

a.set("Hello World!");

多态在这里不起作用。请记住,您需要在子类中重写父类的方法,以便可以使用父类var触发多态。


桥方法的作用是用名称相同但签名不同的方法的所有信息以静默方式覆盖父类中的方法。借助于桥接方法,多态性起作用了。尽管从表面上看,您可以使用具有不同签名的方法覆盖父类方法。


查看完整回答
反对 回复 2019-10-08
?
茅侃侃

TA贡献1842条经验 获得超21个赞

令人惊讶的是,编译器会推断出该MyComparator方法:


public int compare(Integer a, Integer b) {/* code */}

正在尝试覆盖Comparator<T>的


public int compare(T a, T b);

从声明的类型Comparator<Integer>。否则,编译器会将MyComparators compare作为附加(重载)方法,而不是覆盖该方法。因此,将不会为此创建桥方法。


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 675 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信