推論の元になる引数が複数あったらどうなるか
以下のような関数では、型パラメータ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 ); // エラー