请看下面的例子:为什么在执行时不能执行重载?
interface I {}
class A implements I {}
class B implements I {}
class Foo{
void f(A a) {}
void f(B b) {}
static public void main(String[]args) {
I[] elements = new I[] {new A(), new B(), new B(), new A()};
Foo o = new Foo();
for (I element:elements)
o.f(element);//won't compile
}
}
为什么不重载方法支持向上转型?
如果超载在运行时实现,它也提供了更多的灵活性。例如,访问者模式会更简单。是否有任何技术原因阻止Java这样做?
我试图想象这种方法的语义是如何工作的,而我的大脑只是“ew”。我希望能够改变我正在使用的接口的实现,并让代码的其余部分工作完全一样。 –
因为静态地试图确定一个对象的运行时间类型将类似于只是简单地运行该程序? – Perception
@Perception他问为什么重载调度不能延迟到运行时而不是在编译时解析。这听起来像会给JVM和类加载逻辑增加很大的复杂性。 –