为了账号安全,请及时绑定邮箱和手机立即绑定

将泛型参数传递给类的方法或将方法的结果转换为给定的泛型类型?

将泛型参数传递给类的方法或将方法的结果转换为给定的泛型类型?

芜湖不芜 2021-12-01 19:01:12
我需要从一个方法返回一个结果,其中返回的对象本身应该与泛型参数具有相同的类型。这似乎比我想象的要困难。这是一个简化的示例:import android.content.Context;public class PreferencesManager<T>{    private EncryptingPreferencesManager<T> encryptingPreferencesManager;    public PreferencesManager(Context context)    {        encryptingPreferencesManager = new EncryptingPreferencesManager<>(context);    }    public T getPreferencesData(String identifier)    {        T data = encryptingPreferencesManager.getData(identifier);    return data;    }}...和实例化的类:public class EncryptingPreferencesManager<T>{    private Context context;    public EncryptingPreferencesManager(Context context)    {        this.context = context;    }    @SuppressWarnings("unchecked")    public T getData(String identifier) throws GeneralSecurityException, IOException    {    //do some stuff and get the content, which is a JSON         final T result = (T)JsonMapper.fromJsonToJavaObject(decryptedJson, ??????.class);        return result;    }}这是 JsonMapper 方法:public static Object fromJsonToJavaObject(String jsonObject, Class<?> clazz) throws JsonParseException, JsonMappingException, IOException{    return objectMapper.readValue(jsonObject, clazz);}不应更改 Json 映射器方法。它基本上有效。什么不能正常工作是中间的类与部分??????.class。如果我在这里传递一个像CorrectResultObject.class这样的类定义,getData(...) 将返回一个 CorrectResultObject 的实例,所以这是有效的。但这必须是通用的。由于我无法通过T.class 之类的东西,我想通过Object.class,但最终结果(在转换后,如上所示)突然变成了 LinkedHashMap?!我不明白T的类型信息是如何丢失的,因为类本身是用 T 实例化的,并且类型擦除只发生在转换时的方法中,而不发生在实例化的类中?!我必须如何编写类来实现getData(...)返回正确泛型类型的实例?
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以修改getData方法并将Class对象传递给它以返回同一类的对象。

像这样的东西:


public T getData(String identifier, Class<? extends T> clazz) throws GeneralSecurityException, IOException {

    //do some stuff and get the content, which is a JSON 


    final T result = (T)JsonMapper.fromJsonToJavaObject(decryptedJson, clazz);


    return result;

}

希望这可以帮助


查看完整回答
反对 回复 2021-12-01
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

你说:


不应更改 Json 映射器方法。它基本上有效。


我不会这么说。它也需要参数化,就像objectMapper.readValue.


改成这样:


public static <T> T fromJsonToJavaObject(String jsonObject, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException

{

    return objectMapper.readValue(jsonObject, clazz);

}

并避免在这里投射: (T)JsonMapper.fromJsonToJavaObject


查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信