受け取ったリスト内の各項目のゲッターを実行するジェネリックを使用した次のメソッドがあります。
public static <T, S> List<S> getValues(List<T> list, String fieldName) {
List<S> ret = new ArrayList<S>();
String methodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1, fieldName.length());
try {
if (list != null && !list.isEmpty()) {
for (T t : list) {
ret.add((S) t.getClass().getMethod(methodName).invoke(t));
}
}
} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) {
}
return ret;
}
次のように呼び出すと、完全に正常に動作します。
List<Integer> ids = getValues(List<MyDTO>, "id");
request.setListIds(ids);
ただし、1 行で実行するとコンパイル エラーが発生します。
request.setListIds(getValues(List<MyDTO>, "id"));
エラーは言う:
タイプ MyDTO のメソッド setListIds(List-Integer-) は、引数 (List-Object-) には適用されません。
そのため、リストを直接設定しようとすると、ジェネリックが整数ではなくオブジェクトにキャストされます。何故ですか?