2014-11-01 2 views
0

Я пытаюсь решить проблемы с Java-типами из-за использования непечатаемой библиотеки. Например.Guava TypeToken для разрешения предупреждений необработанных типов

List dataAsList = response.getDataList(); 

Я знаю, что список типа

List<Map<String,Object>> 

Но я не знаю, как преобразовать нетипизированный «response.getDataList()» в машинописные версии.

Я прочитал Guava TypeToken можно использовать для проблем типа, но я не уверен, как использовать это, и мои попытки не работают.

+0

«Но я не знаю, как преобразовать нетипизированный ответ response.getDataList()» в типизированную версию ». -> ну, просто бросьте его: '(List >) response.getDataList()'. Вы все равно получите предупреждение типа от компилятора, но тогда вы можете '@SuppressWarnings (« unchecked »)' заявление – fge

+0

Это то, что я не хочу делать. Я не хочу получать предупреждения типа, и я не хочу подавлять предупреждения. – edu00085

+0

Нечто похожее здесь, но для списков и без использования TypeToken: http://stackoverflow.com/a/2848268/4089265 – edu00085

ответ

0

Если общий аргумент List является необработанным типом, то есть он не имеет общих аргументов, просмотрите my answer to a different question, который использует решение Guava.

В противном случае вы можете выполнить сериализацию/десериализацию с помощью Gson. Это, вероятно, относительно медленно по сравнению с другими решениями, но является самым чистым в реализации. Предполагая, что вы не делаете этого много раз за запрос, это не должно быть хуже, чем любой вызов ввода-вывода, такой как запрос базы данных. Примером ниже является оптимизированная модификация примера использования в Gson API.

Этот пример должен работать для большинства простых классов, для которых не требуется специализированная сериализация.

private final static Gson GSON = new Gson(); 

public static <T> T cast(Object object, TypeToken<T> token){ 
    String json = GSON.toJson(object); 
    T result = GSON.fromJson(json, token.getType()); 
    return result; 
} 

Использование:

List<Map<String,String>> dataAsList = cast(
    response.getDataList(), new TypeToken<List<Map<String,String>>>(){}); 

Отказ от ответственности:

В конкретной ситуации вы описать это решение не будет работать, так как тип значения Карты объекта и Gson не знает, какой тип вы хотите Перевести в. Я не уверен, что это вызовет исключение или просто оставит его как JsonObject или какой-либо другой тип. Я постараюсь исследовать это больше.

+0

Похоже, что 'String' с' Object', но любое 'Number' становится' Double', 'List' становится' ArrayList', а POJO становится 'com.google.gson.internal.StringMap'. В принципе, вы не можете полагаться на Gons casting на сложные типы, не указав их в 'TypeToken'. –