Javaが呼び出されるメソッドを把握することはできません

ミハイロフバレンタイン:

私は(理由は見つかっていないJLSでの Javaコンパイラは、以下のプログラムで実行するための適切な方法をchouseできない理由を):

public class UpperLevelClass {
    private static String getStringanotherNameMethod(String a, String b) {
        return null;
    }

    private static String firstSignatureMethod(String a, String b) {
        return null;
    }

    static class StaticNestedClass extends UpperLevelClass{
        public void getStringfirstNameMethod(String a, Integer b) {
            getStringanotherNameMethod("test", "fff");//compiles
            firstNameMethod("test", "fff");//error below
        }
    }
}

次のエラーで終了をコンパイルします:

error: method firstNameMethod in class StaticNestedClass cannot be applied to given types;
            firstNameMethod("test", "fff");
            ^
  required: String,Integer
  found: String,String
  reason: argument mismatch; String cannot be converted to Integer

いくつかの歴史を追加します:

最初に私はいくつか持っていたstaticとの方法default罰金(静的ネストされたクラスからの)上位レベルの呼び出しでアクセスしてeverethingコンパイルと実行を。次いでstatic方法アクセスに変更したprivateとのprogrammは、一の方法(この場合firstNameMethod)、他の方法のコンパイル罰金に誤差によるコンパイルを停止します。


私は(@へTHX試してみましたジョーンVerneeを Eclipseでプログラムの開発をコンパイルして実行するために)、それがコンパイルし、実行されます。

ジョー・C:

適切なメソッドを検索する二段階プロセスです。

ステップ1は、検索対象のクラスを選択することを含みます。このステップのJLSの該当する行:

場合識別子は、その名前の可視メソッド宣言の範囲に表示されます。

そのメソッドがメンバである包囲型宣言がある場合、Tは、最も内側のような型宣言とします。検索にクラスやインタフェースがTです。

それが言うことに注意してください識別子ではなく署名をここに。それが唯一の引数をこの段階でメソッド名を見て、とされていません。この手段。のでStaticNestedClass呼び出されたメソッドが含まれgetString、それが検索されるクラスです。

我々は、引数が考慮されていることをステップ2に着くときだけです。何も存在しないためgetStringにメソッドStaticNestedClassのメソッド呼び出しと互換性のある、このリードのコンパイルは失敗します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=199142&siteId=1