コンパイルしないと予想していた次のJavaプログラムがありますが、実行されました。
class Test {
public static void f() {
}
void m() {
Test.<String>f();
}
}
javacがこのようにパラメータ化されていないメソッドの呼び出しを許可するのはなぜですか?
私のJavaコンパイラのバージョン:javac 1.7.0_75
質問
コンパイルしないと予想していた次のJavaプログラムがありますが、実行されました。
class Test {
public static void f() {
}
void m() {
Test.<String>f();
}
}
javacがこのようにパラメータ化されていないメソッドの呼び出しを許可するのはなぜですか?
私のJavaコンパイラのバージョン:javac 1.7.0_75
どのJDKバージョンを使用していますか?私にはコンパイルされません(JDK 1.5および1.6)
@Albert Oh、Java 7を使用しています。JDKバージョンで説明を編集します。
このようなものを入手した場所ⁿ|ⁿ–
明示的な型パラメーターは単に無視されます。
これは、 JLS、セクション15.12.2.1に記載されています 。
- メソッド呼び出しに明示的な型引数が含まれ、メンバーがジェネリックメソッドである場合、型引数の数はメソッドの型パラメーターの数と等しくなります。
この節は、非ジェネリックメソッドが、明示的な型引数を提供する呼び出しに適用できる可能性があることを意味します。 確かに、それは適用可能になることがあります。 そのような場合、型引数は単に無視されます。