Java - 两个方法名称相同,参数相同但类型不同,但类型在层次上相关
Java - Two methods with same name, same argument of different type, but the types are related hierarchically
假设我有
Interface A {
public void doSomething(Object a);
}
Interface B {
public void doSomething(Foo b);
}
和
Class C implements A, B {
public void doSomething(Object a) { print("a"); }
public void doSomething(Foo b) { print("b"); }
}
我猜调用 new C.doSomething(new Foo());
会打印 "b"
,即使 Foo 扩展了 Object.
但是如果我想要 子方法:
的共同行为呢?
Class C implements A, B {
public void doSomething(Object a) { print("common behavior from " + a ); }
public void doSomething(Foo b) { doSomething((Object) b); }
public void doSomething(Bar c) { doSomething((Object) c);}
}
当我用 Foo
和 Bar
调用 doSomething
时,这会起作用吗?或者它们会因为最后做 ((Object) c) instanceof Bar == true
而陷入无限循环吗?
Java如何定义调用哪个方法?
重载解析发生在编译时。 b
或 c
的运行时类型是什么并不重要。只要将它们转换为 Object
,它就会调用 Object
重载。所以你的例子应该可以正常工作。
另一个常见的用例是你想将文字 null
传递给一个方法,你需要将它转换为某种类型以避免重载歧义。例如。 c.doSomething((Foo)null)
.
假设我有
Interface A {
public void doSomething(Object a);
}
Interface B {
public void doSomething(Foo b);
}
和
Class C implements A, B {
public void doSomething(Object a) { print("a"); }
public void doSomething(Foo b) { print("b"); }
}
我猜调用 new C.doSomething(new Foo());
会打印 "b"
,即使 Foo 扩展了 Object.
但是如果我想要 子方法:
的共同行为呢?Class C implements A, B {
public void doSomething(Object a) { print("common behavior from " + a ); }
public void doSomething(Foo b) { doSomething((Object) b); }
public void doSomething(Bar c) { doSomething((Object) c);}
}
当我用 Foo
和 Bar
调用 doSomething
时,这会起作用吗?或者它们会因为最后做 ((Object) c) instanceof Bar == true
而陷入无限循环吗?
Java如何定义调用哪个方法?
重载解析发生在编译时。 b
或 c
的运行时类型是什么并不重要。只要将它们转换为 Object
,它就会调用 Object
重载。所以你的例子应该可以正常工作。
另一个常见的用例是你想将文字 null
传递给一个方法,你需要将它转换为某种类型以避免重载歧义。例如。 c.doSomething((Foo)null)
.