类型安全:在泛型 class 中未经检查的强制转换

Type safety: Unchecked cast in generic class

我有一个通用 class.It 看起来像这样:

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
    }
...
}

显然 conevertDataToJSONString 方法仅在 T 是 String type.But 时才调用 有一个警告:

Type safety: Unchecked cast from String to T

有没有不用 SuppressWarnings:

就能解决的方法

@SuppressWarnings("unchecked")

方法之前?

看起来,你可以使用 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 的实际情况有一些预知。您或许应该阅读 "Why Use Generics?" 并考虑泛型是否真的是这里的正确解决方案。

您必须通过以下代码将字符串转换为 T:

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