簡體   English   中英

類型安全:泛型類中的未經檢查的強制轉換

[英]Type safety: Unchecked cast in generic class

我有一個通用類。它看起來像這樣:

public class DataConverter<T> implements Converter<T> {

    @Override
public T convert(Class<T> type, Object value) {
    if ((type.equals(String.class)) && ... ) {
        return conevertDataToJSONString((Data) value);
    } 
    ...
}

    private T conevertDataToJSONString(Data data) {
        String value = gson.toJson(data);
        return (T) value; // << Type safety: Unchecked cast from String to T
    }
...
}

顯然只有當T是 String 類型時才會調用conevertDataToJSONString方法。但是有一個警告:

類型安全:從 String 到 T 的未經檢查的強制轉換

有沒有辦法在不使用SuppressWarnings情況下解決這個問題:

@SuppressWarnings("未選中")

之前的方法?

看起來,您可以使用Class.cast(Object)因為您已經擁有Class<T>

@Override
public T convert(Class<T> type, Object value) {
    if ((type.equals(String.class)) && ... ) {
        //     casting here
        return type.cast( conevertDataToJSONString((Data) value) );
    } 
    ...
}

// no need to make this method generic
private String conevertDataToJSONString(Data data) {
    return gson.toJson(data);
}

但是,您對if(type.equals(String.class))讓我感到疑惑——因為這意味着您對T實際是什么有一些預知。 您或許應該閱讀“為什么使用泛型?” 並考慮泛型在這里是否真的是正確的解決方案。

您必須通過以下代碼將字符串轉換為 T:

String value = gson.toJson(data);
T elem = transformer.transform(value);
return T;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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