泛型我能让这个java pulk()方法更安全吗?
我写了这个实用函数:
public static <T> List<T> pluck(String fieldName, List list)
throws NoSuchFieldException, IllegalAccessException {
if (list.isEmpty()) {
return new ArrayList<T>();
}
Class c = list.get(0).getClass();
Field f = c.getField(fieldName);
ArrayList<T> result = Lists.newArrayList();
for (Object object : list) {
result.add((T) f.get(object));
}
return result;
}
我从underscore.js复制了这个想法。用例是:
ArrayList<Person> people = new ArrayList<Person>;
people.add(new Person("Alice", "Applebee"));
people.add(new Person("Bob", "Bedmington"));
people.add(new Person("Charlie", "Chang"));
List<String> firstNames = pluck("firstName", people);
我的问题是,如果调用者的类型错误,在调用者尝试从列表中获取对象之前,不会引发异常。理想情况下,我想从pluck
方法本身抛出一个ClassCastException
。但是,我看不到在运行时访问列表类型的方法
我能用什么技巧来确保打电话的人不会得到无效的名单吗
编辑:因此,根据我得到的反馈,安全的实施方案是:
public static <T,F> List<F> pluck(String fieldName, Class<F> fieldType,
List<T> list, Class<T> listType)
throws NoSuchFieldException, IllegalAccessException {
Field f = listType.getField(fieldName);
ArrayList<F> result = new ArrayList<F>();
for (T element : list) {
result.add(fieldType.cast(f.get(element)));
}
return result;
}
但事实上兰姆达杰似乎做了我想做的,所以我想我会用它。谢谢迈克
免责声明:LambdaJ(@GoogleCode@GitHub)-自JDK8(JSR 335,JEP 126)发布以来,该项目不再维护
共 (0) 个答案