![](/img/trans.png)
[英]converting Object returned by Field.get() to String[] in java reflection
[英]Java Reflection: (Type) field.get(object) - unchecked cast
以下代碼使用Reflection 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注釋是到達這里的方式。.謝謝您的時間。
盡管Class方法強制轉換仍然可以引發ClassCastException,但它不需要@SupressWarnigns。
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並不是很糟糕-嘗試將其限制為聲明+賦值,但不要將其放在方法中。
Field的get
方法的簽名是
public Object get(Object obj) {
...
}
由於它不是通用的,因此返回類型為Object,因此您不能強制在編譯時出現任何錯誤。
如果您是確保該值的類型是ValueType
的時候,再加入文檔的方法,並稱類型將永遠值類型和使用@SuppressWarnings(“未登記”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.