【问题标题】:Java Reflection: (Type) field.get(object) - unchecked castJava 反射:(Type) field.get(object) - 未经检查的强制转换
【发布时间】:2015-11-02 15:43:01
【问题描述】:

以下代码使用反射 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 注释是去这里的方式。谢谢你们的时间。

【问题讨论】:

  • 将得到的值包装成 KeyType.class.cast(Object obj)
  • KeyType 是通用的。由于类型擦除,这将不起作用。还有其他想法吗?
  • 我不认为它是通用的。
  • 这是一种重要信息,应该有问题...请编辑您的帖子并在此处包含此信息。
  • 为了避免以后阅读代码时出现这种混淆,我们一般使用一个字母的泛型名称,例如K 用于键类型,V 用于值类型等等。

标签: java reflection unchecked-cast


【解决方案1】:

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 还不错 - 尝试将其限制为声明+赋值,不要将其放在方法上。

【讨论】:

  • 对不起,我应该提到 KeyType 是一个泛型。由于类型擦除,您的解决方案将不起作用。我正在考虑将 KeyType 的类类型传递给此类的构造函数。
【解决方案2】:

Field的get方法的签名是

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

由于它不是通用的,返回类型是对象,你不能强制任何错误出现在编译时

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多