类型安全:在泛型 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;
我有一个通用 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;