Можем ли мы передать имя класса в качестве параметра? - PullRequest
0 голосов
/ 18 февраля 2020
private void passClassName(String className) {
    JSONArray jsonArray = <ReadSomeJsonFile>;
    String dataSet = jsonArray.toString();
    List<className> testData = new Gson().fromJson(dataSet, new TypeToken<List<className>>() {}.getType()); 
}

Здесь я хочу передать ClassName в качестве параметра. Но так как этот класс не будет доступен с параметром. Так что не получится. Я уже пробовал аналогичные решения . У меня ничего не получалось до сих пор.

1 Ответ

1 голос
/ 18 февраля 2020

Вы не можете сделать эту динамику c, с классом, данным во время выполнения. Чтобы это работало, компилятор должен иметь возможность создать анонимный класс для new TypeToken<List<MyClass>>() {}. Это не может быть сделано во время выполнения.

Что ж, это возможно, но теперь вы вошли во время создания динамического c байт-кода во время выполнения, поэтому давайте пропустим этот сверхсложный вариант. Задайте другой вопрос, если вы хотите изучить этот маршрут.

Это означает, что вызывающая сторона должна создать TypeToken анонимный класс, например, так:

private <E> List<E> readJsonList(TypeToken<List<E>> typeToken) {
    JSONArray jsonArray = <ReadSomeJsonFile>;
    String dataSet = jsonArray.toString();
    List<E> testData = new Gson().fromJson(dataSet, typeToken.getType());
    return testData;
}

Caller

List<Integer> list = readJsonList(new TypeToken<List<Integer>>() {});
...