これは、JLS で指定されているとおりです。
複数のメンバー メソッドがアクセス可能で、メソッド呼び出しに適用できる場合は、ランタイム メソッド ディスパッチの記述子を提供するために 1 つを選択する必要があります。Java プログラミング言語では、最も具体的な方法が選択されるという規則が使用されます。
AString
は-a ですが、すべてが -a というObject
わけではありません。したがって、はよりも具体的です。したがって、上記の例でオーバーロードが選択されている理由です。Object
String
String
Object
String
この正確な質問(本質的に) が素晴らしいJava Puzzlers (強く推奨)、特にPuzzle 46: The Case of the Confusing Constructor に登場したことは注目に値します。
Java のオーバーロード解決プロセスは、2 つのフェーズで動作します。最初のフェーズでは、アクセス可能で適用可能なすべてのメソッドまたはコンストラクターを選択します。第 2 段階では、第 1 段階で選択されたメソッドまたはコンストラクターのうち、最も具体的なものを選択します。あるメソッドまたはコンストラクターは、他のメソッドまたはコンストラクターに渡されたパラメーターを受け入れることができる場合、他のものよりも具体的ではありません
このパズルを理解するための鍵は、メソッドまたはコンストラクターが最も具体的なテストでは、実際のパラメーター(呼び出しに表示されるパラメーター)を使用しないということです。それらは、適用可能なオーバーロードを決定するためにのみ使用されます。コンパイラは、適用可能でアクセス可能なオーバーロードを決定すると、正式なパラメーター(宣言に表示されるパラメーター) のみを使用して、最も具体的なオーバーロードを選択します。
締めくくりに、 Effective Java 2nd EditionのItem 41: Use overloading judiciouslyから引用します。
どのオーバーロードが選択されるかを決定するルールは非常に複雑です。それらは言語仕様の33ページを占めており、それらの微妙な点をすべて理解しているプログラマーはほとんどいません。
言うまでもなく、この本も非常におすすめです。
こちらもご覧ください
明示的なキャストについて
では、引数を指定してObject
オーバーロードを呼び出すにはどうすればよいでしょうか?null
シンプル:null
を type にキャストしObject
ます。これが役立つ/必要なシナリオがいくつかありますが、これはその 1 つです。
たとえば、 ? を取るオーバーロードがある場合はどうなりInteger
ますか?
次に、メソッド呼び出しがあいまいで、コンパイル時エラーが発生します。
最も具体的なメソッドが 2 つ以上あるため、最も具体的なメソッドがない可能性があります。この場合 [... いくつかの例外を除いて] メソッド呼び出しがあいまいであると言い、コンパイル時エラーが発生します。
あいまいさを解決するために、null
(または他の式) を目的のオーバーロード型にキャストできます。
こちらもご覧ください