最近、答えが見つからず、テスト コードを実行するための Java 環境がない 2 つの過負荷の質問に遭遇しました。Javaコンパイラがオーバーロードのために従うすべてのルールのリストを組み立てたり、既存のリストを代わりに指摘したりすることで、誰かが私を助けてくれることを願っています。
まず、2 つのメソッドが最後の varargs パラメーターだけが異なる場合、どのような状況でそれぞれが呼び出され、引数なしで varargs メソッドを呼び出すことができるでしょうか?
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?
2 番目の質問は、2 つのメソッドが呼び出される互いに継承された型によって異なる場合です。最も派生したバージョンが呼び出され、キャストが他のバージョンを呼び出すことができると期待しています。
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?
これらは 2 つの例ですが、コード リーダーとして、コンパイラが何をしているかを確認するためにビルド環境をセットアップする時間がないことがよくあるため、これを解決するために使用される正確な順序付けられたルールの標準的なリストを好みます。