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") .
以下代码使用反射 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") .