http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29によると、Class.getDeclaredMethods()には、クラスによって宣言されたメソッドのみを含める必要があります。 "。ただし、以下のテストコードでかなり驚くべき結果が得られています。
import java.util.Arrays;
class A {
public static A m1() { return null; }
public static A m2() { return null; }
public static A m3() { return null; }
}
class B extends A {
public static A m1() { return null; }
public static B m2() { return null; }
// public static Object m3() { return null; } won't compile
}
public class Scratch {
public static void main(final String[] args) {
System.out.println(Arrays.asList(B.class.getDeclaredMethods()));
}
}
私には非常に奇妙/驚くべきいくつかのこと:
コンパイラは、B.m3()がA.m3()と互換性のない戻り型を持っていることについて文句を言います。これは、JSL 8.4.8.3(ページ225 v3 langspec-3.0.pdf)によって規定されています。しかし、なぜこの制限を静的メソッドに適用する必要があるのか、興味があります。私の理解では、静的メソッドは非表示にしてオーバーライドすることはできず、参照はコンパイル時に解決されるので、この制限の背後にある理由は何ですか?
2つのm2()メソッドが出力に含まれています。これは、getDeclaredMethods()が「クラスによって宣言された」メソッドのみを返し、「継承されたメソッドを除外する」という主張と矛盾するようです。A.m2()がBによって「宣言された」とは見なされません。
1つのm1()が出力に含まれます。前のポイントに続いて、getDeclaredMethods()が2つのm2()を返すようにすることが理にかなっている場合、なぜ2つのm1()も返さないのでしょうか。それらは結局2つの異なる方法であり、一方は他方によって隠されています。m1()の場合のリターンタイプが同じであることを除いて、m1()の場合とm2()の場合の基本的な違いはわかりませんが、私が理解しているリターンタイプはメソッドシグネチャの一部ではありませんか?
前もって感謝します!