3

以下代码使用反射 API 检索字段的值。正如您在提供的图像中看到的,这会生成未经检查的强制转换警告。可以使用@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注释是要走的路……谢谢你们的时间。

解决方案

4

2 回答 2

2

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);

一旦你有一个 KeyType 类的对象,你当然可以,

KeyType keyTypeX = ...; // not null

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

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

于 2015-11-02T15:49:28.990 回答
1

getField 方法的签名是

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

由于它不是通用的,返回类型是 Object,因此您不能强制在compile-time出现任何错误。

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

于 2015-11-02T15:55:10.450 回答