私の理解によると、Javaの次の汎用関数:
public static <T> T f(T x) {
Integer[] arr = new Integer[4];
T ret = (T) arr[2];
return ret;
}
次の形式にコンパイルされます (無制限であるため)。
public static Object f(Object x) {
Integer[] arr = new Integer[4];
Object ret = (Object) arr[2];
return ret;
}
ただし、次のステートメントを実行すると、コンパイラは戻り値が整数型であると判断できます。コンパイラはどのようにそれを理解しますか?
Integer i = f(new Integer(4));
上記のステートメントが機能するためには、関数を次のように記述すべきではありませんか?
public static <T extends Integer> T f(T x) {
Integer[] arr = new Integer[4];
T ret = (T) arr[2];
return ret;
}