Выражение, ожидаемое от метода Json - PullRequest
0 голосов
/ 02 августа 2020

Я не знаю, почему я не могу указать T в качестве параметра в из метода Json.

public class AbstractResponseListener<T> implements Response.Listener<String> {
    @Override
    public void onResponse(String response) {
        Gson gson = new Gson();
        T abstractObject = gson.fromJson(response, T);
    }
}

1 Ответ

0 голосов
/ 19 августа 2020

Единственный способ «передать тип» в Java - передать его объект Class.

Есть несколько проблем, которые не позволяют вам передать T в качестве параметра метода:

  1. T - это тип, а не объект, и поэтому не может быть передан как параметр (или сохранен в переменной, которая фактически является то же самое).

  2. Даже если предыдущая проблема отсутствовала, Java реализация дженериков очень ограничена способом, называемым стиранием типа . Короче говоря, это означает, что фактическое «значение» T ( фактический тип ) доступно только во время типа компиляции (а компилятор выполняет проверки типов и украшает некоторые вызовы с приведением типов), но информация о типе удалена из скомпилированного кода и недоступна в время выполнения .

  3. fromJson() подпись метода (одна из многих возможных, метод сильно перегружен):

    public <T> T fromJson​(JsonElement json, java.lang.Class<T> classOfT) throws JsonSyntaxException
    

    , поэтому он ожидает в качестве второго параметра объект Class . Возможное синтаксически правильное использование будет, например,

    gson.fromJson(response, String.class);
    

    или

    gson.fromJson(response, response.getClass());
    

    Подробнее Получение объектов класса .

И теперь, когда вы знаете , почему вы не можете делать то, что пытаетесь делать :), вы должны подумать о том, чего вы действительно хотите достичь . Возможно, вы стали жертвой проблемы XY :)

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