私は(理由は見つかっていない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でプログラムの開発をコンパイルして実行するために)、それがコンパイルし、実行されます。
適切なメソッドを検索する二段階プロセスです。
ステップ1は、検索対象のクラスを選択することを含みます。このステップのJLSの該当する行:
場合識別子は、その名前の可視メソッド宣言の範囲に表示されます。
そのメソッドがメンバである包囲型宣言がある場合、Tは、最も内側のような型宣言とします。検索にクラスやインタフェースがTです。
それが言うことに注意してください識別子ではなく署名をここに。それが唯一の引数をこの段階でメソッド名を見て、とされていません。この手段。のでStaticNestedClass
呼び出されたメソッドが含まれgetString
、それが検索されるクラスです。
我々は、引数が考慮されていることをステップ2に着くときだけです。何も存在しないためgetString
にメソッドStaticNestedClass
のメソッド呼び出しと互換性のある、このリードのコンパイルは失敗します。