也许您有一个用例,您需要来自 Integer getFoo() 的信息,而 Number getFoo() 没有。假设您有一个计算 Bars 的应用程序:
public class BarCounter {
public static void main(String[] args) {
Bar bar = new MyBar();
System.out.println("Bar #" + bar.getBarCounter());
bar = new MyOtherBar();
System.out.println("Bar #" + bar.getBarCounter());
}
}
对您的 BarCounter 而言,重要的是 getBarCounter 返回一个可以打印的数字。所以 Bars 实现了 Bar 接口,它就是这么说的:
public interface Bar {
public Number getBarCounter();
}
特别是,MyBar 是您的第一个 Bar:
public class MyBar implements Bar {
public Integer getBarCounter() {
return Integer.valueOf(1);
}
}
而你的另一个酒吧知道:
public class MyOtherBar extends MyBar {
public Integer getBarCounter() {
return Integer.valueOf(super.getBarCounter() + 1);
}
}
如果 MyBar.getBarCounter() 返回数字,则不会使用 NoSuchMethodError 进行编译。
该示例是人为设计的,但一般原则是:当您扩展实现通用接口 (Bar) 的类 (MyBar) 时,您的扩展类 (MyOtherBar) 应该可以访问其父类 (MyBar) 拥有的所有信息,在这种情况下, getBarCounter 是一个整数。
在现实生活中,当您有一个使用泛型 List 或 Set 的类时,偶尔会出现这种情况,然后发现自己处于必须扩展此类的情况,因为在这种情况下您需要 ArrayList 或 HashSet。然后您的扩展类(及其所有子类)应该知道他们正在处理的特定子类。