有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型我能让这个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 335JEP 126)发布以来,该项目不再维护


共 (0) 个答案