Java 反射:(类型)field.get(对象)- 未经检查的转换

Java Reflection: (Type) field.get(object) - unchecked cast

以下代码使用反射 API 检索字段的值。 正如您在提供的图像中看到的那样,这会生成 unchecked cast 警告。 可以使用 @SuppressWarnings("unchecked") 来抑制警告。不过,我想知道是否有替代方案?

更新:KeyType 是通用的。所以 KeyType.class.cast(object); 由于类型擦除而无法工作。

private K getId(Field idField, V o) {
    K id = null;
    try {
        idField.setAccessible(true);
        id = (K) idField.get(o);
    } catch (IllegalAccessException ignored) {
        /* This never occurs since we have set the field accessible */
    }
    return id;
}


解决方法: 似乎 SuppressWarnings 注释是去这里的方式..谢谢你们的时间。

Class 方法转换不需要 @SupressWarnigns,即使它仍然可以抛出 ClassCastException。

KeyType keyType = KeyType.class.cast( idField.get(o) );

您可以 - 因为在那个位置您应该知道通用参数 - 像这样进行:

private static class ListInteger extends ArrayList<Integer>{}

Object obj = new ArrayList<Integer>();
ListInteger test = ListInteger.class.cast(obj);

一旦您拥有 class KeyType 对象,您当然可以

KeyType keyTypeX = ...; // not null

KeyType keyType = keyTypeX.getClass().cast( obj );

还有其他选择,尽管 @SuppressWarnings 还不错 - 尝试将其限制为声明+赋值,不要将其放在方法上。

Field的get方法的签名是

public Object get(Object obj) { 
 ...
}

由于它不是通用的,return 类型是 Object,您不能强制在 编译时.

出现任何错误

如果您确定值的类型始终是 ValueType,则向该方法添加文档,说明类型将始终是 ValueType 并使用 @SuppressWarnings("unchecked") .