以下の内容はhttps://unageanu.hatenablog.com/entry/20081118/1227006005より取得しました。


今日の罠

↓のようなメソッドとクラスがあって

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.




以上の内容はhttps://unageanu.hatenablog.com/entry/20081118/1227006005より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14