我最近在一个 API 和一个实现中遇到了一个问题,其中出现了以下类型的代码:
public abstract class A {
public A sum(A a) {
System.out.println("A.sum(A) called");
return null;
}
}
实现是一个简单的类:
public class B extends A {
public B sum(B b) {
System.out.println("B.sum(B) called");
return null;
}
}
在使用它时,我写道:
public class Main {
public static void main(String[] args) {
B b = new B();
A basa = new B();
b.sum(b);
basa.sum(b);
basa.sum(basa);
}
}
结果是:
B.sum(B) called
A.sum(A) called
A.sum(A) called
我知道 B 的 sum 不会覆盖 A 的 sum,因为它的签名不同,但我想为有效类型 B 的对象提供 sum 的有效实现。我认为这样的设计非常经典,我想知道我如何应该设计我的 API 和实现,使其高效。
当然,我可以sum(A a)
在 B 类中提供并检查 b 是否是instanceof
B,然后再调用其中之一sum(B b)
或 super,但我认为instanceof
出于效率原因应该避免这种情况。(如果效率低下,我的抽象实现可能效率更低)