読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

今日の罠

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

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.