簡體   English   中英

Java反射:(Type)field.get(object)-未經檢查的轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM