最近気づいたさしずめどうでも良い話ですが、
例えば、下記のような挑発的な書き方でもエラーにならないことがあることに気づきました。
((Foo) null).sayHello();
で、Foo.sayHelloってなんぞやと言うと、
public class Foo {
public static void main(String[] args) {
((Foo) null).sayHello();
}
public static void sayHello() {
System.out.println("hello");
}
}
staticだとレシーバがnullでもOKみたいです(正直なところstaticメソッドにレシーバが付けられるのはJavaの不思議仕様)
おまけ
staticメソッドには仮想関数のような、実行時の型を解決する機能は無いみたいです。
public class Foo {
public static void main(String[] args) {
((Hello) new A()).sayHello();
// -> hello
}
}
class Hello {
public static void sayHello() {
System.out.println("hello");
}
}
class A extends Hello {
public static void sayHello() {
System.out.println("hello, I am A.");
}
}
なんならリフレクションを使って関係無い型をレシーバに渡しても何も言われません。
public class Foo {
public static void main(String[] args) throws Exception {
Class<Hello> klass = Hello.class;
Method method = klass.getMethod("sayHello");
method.invoke(100);
// (new Integer().sayHello)
}
}
class Hello {
public static void sayHello() {
System.out.println("hello");
}
}