mar*_*odb -2 java oop overloading java-17
我正在开发一个具有接口I和类A并B实现它的 Java 程序。我还有另一个类实现C ,它有 2 个带有一个参数的方法:一个接受 A 的对象,另一个接受 B 的对象。
interface I {}
static class A implements I {}
static class B implements I {}
interface C {
String map(A a);
String map(B b);
}
public static void main(String[] args) {
// Injected at runtime;
C mapper = getInstance();
I a = new A();
I b = new B();
// This fail at compilation
String result = mapper.map(a);
}
private static C getInstance() {
return new C() {
@Override
public String map(A a) {
return "a";
}
@Override
public String map(B b) {
return "b";
}
};
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 A 或 BI 的对象调用 C 的方法时,出现以下错误:
java: no suitable method found for map(Main.I)
method Main.C.map(Main.A) is not applicable
(argument mismatch; Main.I cannot be converted to Main.A)
method Main.C.map(Main.B) is not applicable
(argument mismatch; Main.I cannot be converted to Main.B)
Run Code Online (Sandbox Code Playgroud)
即使我们说类型的其他实例I可以传递给映射器,这也应该通过以下方式修复:sealed interface I permits A, B {}
为什么Java中没有运行时方法调度? 我的问题是为什么在java中它不可能比“为什么它不起作用”更多
对于“因为重载选择是在编译时基于参数的静态类型完成的,而不是在运行时基于参数的动态类型完成的”的效果有多种答案。这些陈述 100% 正确;这就是重载的工作原理以及它的设计原理。当 Java 选择单一(基于接收器)调度时,多重调度(“多方法”)是众所周知的。
下一个合理的问题是为什么要这样做?1995 年的成功有以下几个原因:
到 2023 年,编译器和运行时技术已经有了相当大的改进,因此编译时重载选择和运行时分派之间的平衡可能会发生一些变化,但总的来说,这仍然是一个明智且务实的权衡。