类型安全:在通用类中取消选中

时间:2015-04-15 04:33:03

标签: java types type-conversion type-safety

我有一个Generic类。它看起来像这样:

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类型时调用。但是有一个警告:

  

类型安全:未选中从String转换为T

有没有办法解决这个问题而不使用SuppressWarnings

  

@SuppressWarnings(&#34;未选中&#34)

之前的方法?

2 个答案:

答案 0 :(得分:6)

看起来,您可以使用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?"并考虑泛型是否真的是正确的解决方案。

答案 1 :(得分:0)

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

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