Создайте список динамических c введите Java - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать объект List (ну, на самом деле, несколько), не зная заранее о его типе, и передав функции, я хочу создать эти списки с параметром типа Class<?>, поэтому для примера он работает файл, если я возвращаю tickr1, но когда я пытаюсь создать второй список и добавить все элементы этого второго списка, он жалуется:

method java.util.Collection.addAll(java.util.Collection<? extends capture#2 of ?>) is not applicable

Есть ли способ создать список в любом случае похож на

List<clazz.clazz.getTypeName()> tickr1 ...

В конце я использовал List и получил желаемые результаты, но есть ли лучший способ?

public class Crawler {

    private List<?> metacrawler(String level1, String level2, Class<?> clazz, String resource) throws IOException {
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
        Reader inr = new InputStreamReader(in);
        String json = CharStreams.toString(inr);
        Object glue = JsonPath.read(json, "$."+level1+"[*]."+level2);
        ObjectMapper om = new ObjectMapper();

        List<?> tickr = om.readValue(glue.toString(),
                                    om.getTypeFactory().constructCollectionType(List.class, clazz));
        List<?> tickr2 = om.readValue(glue.toString(),
                                    om.getTypeFactory().constructCollectionType(List.class, clazz));
        tickr.addAll(tickr2);

        return tickr;
    }

    public List<ObjectType1> getObjectsOfType1() throws IOException {
        return (List<ObjectType1>)metacrawler("firstlevel", "secondlevel", ObjectType1.class, "1.json");
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете создать что-то вроде этого:

    public static void main(String[] args) {
        List<String> list = (List<String>) metacrawler(String.class);
        System.out.println(list);
    }

    private static <T> List<?> metacrawler(T clazz) {
        List<T> list = new ArrayList<>();
        list.add((T) Arrays.asList("test1", "generic"));
        list.add((T) Arrays.asList("test2", "generic"));
        return list;
    }

, вывод

[[test1, generic], [test2, generic]]
...