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

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

推論の元になる引数が複数あったらどうなるか

以下のような関数では、型パラメータXの型は引数によって推論されて決まります。

// 型パラメータで指定されたXを引数で複数受け取る関数。
// 渡される引数によりXが決定する。
static <X> X test( X a, X b ) {
    return a;
}

ここで、ぱっとみ、引数a,bの型は同じか代入互換性がないとだめだろーなーと思いきや、実は以下のような呼び出しもできてしまいます。

test( "a", "b" ); // これはまあOKとして
test( "a", new Object() ); // こんなのや
test( "a", 10 ); // こんなのもOK

どうなっているかというと、内部では引数a,bの共通の親クラスが算出され、Xの型として使われるらしい。(→Java Generics FAQsより)
ふむ。

で、引数a,bの型に代入互換性がない場合エラーにしたい時は、↓のようにすればよい。

static <X,Y extends X> X test2( X a, Y b ) {
    return a;
}

こっちだと、次のような動作になります。

test2( "a", "b" ); // OK
test2( new Object(), "b" ); // OK
//test2( "a", new Object() );// エラー
//test2( "a", 10 ); // エラー