当字符串名称引用字段时,如何获取泛型对象上的字段类

时间:2017-02-08 20:11:55

标签: java generics nested-generics

我有一个方法,它接受一个对象和一个字符串(该字符串是该对象上字段的名称)。所以我从对象类中获取字段并使用field.get(object)来获取值。但我想将该值转换为该字段定义的任何类。有没有办法在不需要使用@suppressWarnings(“unchecked”)的情况下进行演员表?

这是我的代码。我将它简化为仅使用一个对象,但是原始对象使用了一个对象列表并返回一个map,其中map-keys是对象的字段值,map-values是对象。

public static <T1,T2> T2 getFieldValue(T1 obj, String fieldName){
    Field field = null;
    T2 value = null;
    try {
        field = obj.getClass().getField( fieldName );
    } catch ( NoSuchFieldException e ) { ... }
    if ( field != null ){
        try {
            value = (T2)field.get(obj);  // <--- unchecked cast!!!
        } catch ( IllegalAccessException e ) { ... }
    }
    return value;
}

1 个答案:

答案 0 :(得分:2)

如果可能的话,我建议传递T2类的参数。通过传递Class<T2>,您可以调用cast方法。如果演员表无效,此方法将抛出ClassCastException。这也将删除未经检查的警告消息。

public static <T1, T2> T2 getFieldValue(T1 obj, String fieldName, Class<T2> cls) {
    Field field = null;
    T2 value = null;
    try {
        field = obj.getClass().getField(fieldName);
    } catch (NoSuchFieldException e) {
    }
    if (field != null) {
        try {
            value = cls.cast(field.get(obj));  // <---  no unchecked cast!!!
        } catch (IllegalAccessException e) {
        } catch (ClassCastException e) {
        }
    }
    return value;
}