猿问

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

我需要从一个方法返回一个结果,其中返回的对象本身应该与泛型参数具有相同的类型。这似乎比我想象的要困难。


这是一个简化的示例:


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(...)返回正确泛型类型的实例?


芜湖不芜
浏览 183回答 2
2回答

收到一只叮咚

您可以修改getData方法并将Class对象传递给它以返回同一类的对象。像这样的东西:public T getData(String identifier, Class<? extends T> clazz) throws GeneralSecurityException, IOException {&nbsp; &nbsp; //do some stuff and get the content, which is a JSON&nbsp;&nbsp; &nbsp; final T result = (T)JsonMapper.fromJsonToJavaObject(decryptedJson, clazz);&nbsp; &nbsp; return result;}希望这可以帮助

守着星空守着你

你说:不应更改 Json 映射器方法。它基本上有效。我不会这么说。它也需要参数化,就像objectMapper.readValue.改成这样:public static <T> T fromJsonToJavaObject(String jsonObject, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{&nbsp; &nbsp; return objectMapper.readValue(jsonObject, clazz);}并避免在这里投射: (T)JsonMapper.fromJsonToJavaObject
随时随地看视频慕课网APP

相关分类

Java
我要回答