我最近遇到了两个重载问题,我找不到答案,也没有 java 环境来运行一些测试代码。我希望有人可以通过汇编Java编译器遵循的所有规则列表来帮助我重载或交替将我指向一个已经存在的列表。
首先,当两个方法的区别仅在于最终的可变参数参数时,在什么情况下会调用每个方法,您可以在没有任何参数的情况下调用可变参数方法吗?
private void f(int a) { /* ... */ }
private void f(int a, int... b) { /* ... */ }
f(12); // calls the former? I would expect it to
f(12, (int[])null); // calls latter, but passes null for b?
// Can I force the compiler to call the second method in the same fashion
// as would happen if the first method didn't exist?
第二个问题,当两种方法因从彼此继承的类型不同而被调用时?我希望调用最衍生的版本,并允许调用另一个版本。
interface A {}
class B implements A {}
class C implements A {}
private void f(A a) {}
private void f(B b) {}
f(new C()); // calls the first method
f(new B()); // calls the second method?
f((A)(new B()); // calls the first method using a B object?
这是两个示例,但作为代码阅读器,我更喜欢用于解决此问题的确切有序规则的规范列表,因为我经常没有时间设置构建环境来检查编译器在做什么。