Java | 桥接方法

public class SuperClass {
  private Number number;

  public void setNumber(Number number) {
    System.out.println("[SuperClass]setNumber(Number)");
    this.number = number;
  }
}

public class SubClass1st extends SuperClass {
  public void setNumber(Integer n) {
    System.out.println("[SubClass1st]setNumber(Integer)");
  }
}

public class SubClass2nd extends SuperClass {
  public void setNumber(Integer n) {
    System.out.println("[SubClass2nd]setNumber(Integer)");
  }
}

这里有3个类,它们之间的关系如下图:

Java | 桥接方法_第1张图片

很显然子类的中的setNumber(Integer)不是父类setNumber(Number)的覆盖。那么对于下面的似乎是多态的调用,结果会是什么呢?

public class Test {
  public static void main(String[] args) {
    SuperClass[] subClasses = { new SubClass1st(), new SubClass2nd() };

    for (SuperClass sub : subClasses) {
      sub.setNumber(1024);
    }
  }
}

会打印出“[SubClass1st]setNumber(Integer)”和“[SubClass2nd]setNumber(Integer)”吗?

答案是否定的,下面是结果:

[SuperClass]setNumber(Number)
[SuperClass]setNumber(Number)

这种情况下多态的使用并不能帮助我们调用看似最合适的方法(setNumber(Integer))。我们可以猜测,对于子类没有覆写(override)的方法,运行时会直接调用声明变量类型的方法,即父类方法,而不是实际引用的对象的方法。

如果我们将代码稍作改动:

public class SubClass1st extends SuperClass {
  public void setNumber(Integer n) {
    System.out.println("[SubClass1st]setNumber(Integer)");
  }

  // bridge method
  @Override
  public void setNumber(Number number) {
    setNumber((Integer) number);
  }
}

public class SubClass2nd extends SuperClass {
  public void setNumber(Integer n) {
    System.out.println("[SubClass2nd]setNumber(Integer)");
  }

  // bridge method
  @Override
  public void setNumber(Number number) {
    setNumber((Integer) number);
  }
}

那么结果就会符合我们的预期:

[SubClass1st]setNumber(Integer)
[SubClass2nd]setNumber(Integer)

以上是我在看到Java泛型的桥接方法时所进行的一点点探索,还有很多理论上不清楚的地方留待继续深入。

 

你可能感兴趣的:(Java,泛型,桥接方法)