Передать аргумент Generics в метод класса или привести результат метода к данному типу Generics? - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно вернуть результат из метода, в котором сам возвращаемый объект должен иметь тот же тип, что и параметр Generics.Это кажется сложнее, чем я думал.

Вот упрощенный пример:

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 (...) возвращает экземпляр правильного типа Generics?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы сказали:

Не следует изменять метод картографирования 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

0 голосов
/ 22 октября 2018

Вы можете изменить метод 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;
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...