我有以下带有泛型的方法,该方法执行接收到的列表中每个项目的getter:
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);
但是,如果我在一行中执行此操作,则会给我一个编译错误:
request.setListIds(getValues(List<MyDTO>, "id"));
错误提示:
MyDTO类型的方法setListIds(List-Integer-)不适用于参数(List-Object-)
因此,当我尝试直接设置列表时,它将泛型转换为Object而不是Integer。这是为什么?
这是由于Java的类型推断能力很弱。当您直接分配给变量时,它可以推断出类型,但不会根据目标参数类型来推断,这在第二个示例中需要。
你可以克服这个 this.<Integer>getValues...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句