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

标签 java generics type-erasure

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

这是一个简化的示例:

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

最佳答案

您可以修改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;
}

希望这有帮助

关于java - 将泛型参数传递给类的方法或将方法的结果转换为给定的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935887/

相关文章:

java - 如何制作高效的hashCode?

c# - 泛型和父/子架构

python - Golang 相当于 pythons __getattr__() 或 __call__()

c++ - 重复继承和static_cast

java - 为什么在 Java 中没有删除成员字段的通用类型信息?

java - 如何保留 lambda 的参数类型?

Java 2d 鼠标点方向旋转

java - 检查数组中是否存在随机数

java - 如何从 HttpClient 切换到 HttpUrlConnection?

java - 有人可以阐明 Java(6) 中的协变返回类型吗?