Мне нужно вернуть результат из метода, в котором сам возвращаемый объект должен иметь тот же тип, что и параметр 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?