Тип стирания, передавая класс в аргументе - PullRequest
2 голосов
/ 12 декабря 2011

Когда я звоню:

ArrayList<MyType> myobject = new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());

все работает правильно, используя fromJson(String, Type)
, когда я звоню:

ArrayList<MyType> myobject = helper(data);

public ArrayList<MyType> helper(String data){
    return new Gson().fromJson(data, new TypeToken<ArrayList<MyType>>(){}.getType());
}

, все равно работает нормально, но когда я звоню:

ArrayList<MyType> myobject = helper(data, MyType.class);

public <T> ArrayList<T> helper(String data, Class<T> type){
    return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}

неверный аргумент типа.
Как исправить последний фрагмент кода?

РЕШЕНИЕ

Как @LewsTherin предложил, я просто дал точный аргумент Type от вызывающей стороны
, так что объявление помощника так:

public <T> ArrayList<T> helper(String data, Type type){
    ArrayList<T> rtn = g.fromJson(data, type);
    return rtn;
}

и вызов как:

variable = helper(data, new TypeToken<ArrayList<MyType>>(){}.getType());

Но если кто-нибудьМожно отредактировать вспомогательную функцию, чтобы упростить код, я отмечу его как правильный!

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Один из способов справиться с этим - проанализировать свой список из GSON:

private <S> List<S> readFromJson(Reader input, Class<S> type) {
    JsonParser parser = new JsonParser();
    JsonElement element = parser.parse(input);
    ImmutableList.Builder<S> builder = ImmutableList.builder();
    for (JsonElement jsonElement : element.getAsJsonArray()) {
        builder.add(fromJson(jsonElement));
    }
    return builder.build();
}

private <S> S fromJson(JsonElement jsonElement, Class<S> type) {
    return configReader.fromJson(jsonElement, type);
}

Кроме того, в документации GSON есть пример, аналогичный тому, что вы пытаетесь выполнить: https://sites.google.com/site/gson/gson-user-guide#TOC-InstanceCreator-for-a-Parameterized

1 голос
/ 12 декабря 2011

Не думаю, что это сработает, если вы используете вспомогательную функцию. Решением может быть передача типа из вызывающего метода. Так что понятно, что происходит.

return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());

Это на самом деле не указывает тип объекта класса. Следовательно, почему это не работает?

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