今日の罠
↓のようなメソッドとクラスがあって
static <V> Expresion eq( Key<V> key, V value ) { System.out.println( "eq" ); return null; } static class Key<V> {} static class Expresion {}
Keyについている型パラメータで、valueに指定できる引数の型をチェックできるようになっているわけです。
Key<String> key1 = new Key<String>(); eq( key1, "a" ); Key<Integer> key2 = new Key<Integer>(); // eq( key2, "a" ); // これはコンパイルエラー
と、ここまでならうまいこと動作するのだけど、実はeqと並列に次のようなメソッドがあってだな。
static <V> Expression eq( Key<V> key, String query, Object... args ) { System.out.println( "eq-query" ); return null; }
これのおかけで、以下はコンパイルエラーにならないわけだ。
Key<Integer> key2 = new Key<Integer>(); eq( key2, "a" ); // あれ?
うむ。あと、こんなのも。これもコンバイルできるけど、eq-queryの方が実行されてしまいます。
Key<?> key3 = new Key<String>(); eq( key3, "a" );
実行結果です。
eq-query
あわせて5回ははまったな。orz.