オブスキュアな宣言
ある位置においてどちらも観測可能な同じ単純名の変数と型がある場合,その位置では,変数名が優先される.その結果,型名を参照できない場合や,意図しない呼び出しがあったりする.
これをオブスキュアな宣言と呼ぶ.
たとえば,かなり無茶な例であるが,
public class Test { public static int indexOf(int i){ return 999; } public int calc2(int i){ String Test = "hoge"; return Test.indexOf(i); } }
こういうコードを書くと最後の文であるTest.indexOf()における"Test"は,ローカル変数名のTestであり,クラス名の"Test"ではないので,StringのindexOfが呼ばれる.もちろん,その前の文で名前を"test"としておくと,TestクラスのクラスメソッドのindexOf()が呼ばれる.
こんなコードを書くのは,世の中の3ppmぐらいだろうし,こんなコードの半減期は2時間ぐらいだろうから,心配はないが.
ただ,構文規則で,「変数の名前は,大文字ではじめるとかいう言語(あるのか?)」から来た人がいたら,微妙に危険だ.