Java: как получить тип List <?>

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

У меня есть :

public class ClassA {
    private List<?> myList;
    // getters, setters
}

myList будет содержать список объектов (DTO):

List<?> myList; // could be List<DTO1> or List<DTO2> ...

Я пытаюсь получить тип списка из другого класса следующим образом:

public class ClassB {
    public void myMethod() {
        // get type of ClassA.getMyList()
    }
}

Я могу получить "ArrayList", только когда пытаюсь использовать такие вещи, как getClass (), getType () ... Попытка получить класс элемента в списке приводит к "LinkedHashMap".

Я действительно хочу добиться этого, используя подстановочный знак для списка.

Итак, есть ли способ получить тип myList с минимальным кодом?


РЕДАКТИРОВАТЬ :

Спасибо всем за ответы.

Только одно: myList содержит элементы типа LinkedHashMap, это было не очень понятно в моем посте.

Кажется, это действительно невозможно. Каждый LinkedHashMap представляет собой объект, но вы не можете знать, какой именно. Это просто список ключей + значений.

ClassA.getMyList().get(0).getClass() пробовали ??

Paplusc 16.11.2018 12:25

Вы не можете. Стирание типа. ClassA, вероятно, должен быть универсальным. class ClassA<T> { private List<T> myList; }

Michael 16.11.2018 12:27

@Michael, но если вы сделаете getClass() из любого элемента в List, вы его получите, не так ли?

Paplusc 16.11.2018 12:34

@Paplusc А что, если это List<Object>? Первый элемент может быть строкой, второй - целым числом, третий - HashMap. Получение класса первого элемента мало что вам скажет.

Michael 16.11.2018 12:35

@Michal Верно, я не думал о такой возможности.

Paplusc 16.11.2018 12:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
12 899
2

Ответы 2

Вы можете попробовать это. Я не знаю, решит ли он вашу цель или нет, но, возможно, состоится.

 import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class App {
    public static void main(String[] args) {
       ClassA classA = new ClassA();

       List<String> strs = new ArrayList<>();

       strs.add("A");
       strs.add("B");

       classA.setRepos(strs);

        String typeOfList = classA.getRepos().getClass().getTypeName();
        System.out.println("Type of variable in classA : "+typeOfList);

        String typeOfListData = classA.getRepos().get(0).getClass().getTypeName();
        System.out.println("Type of data inside the list : "+typeOfListData);

       for (String s: (List<String>)classA.getRepos())
       {
           System.out.println(s);
       }
    }

}

Класс будет таким

import java.util.List;

public class ClassA {
    private List<?> repos;

    public List<?> getRepos() {
        return repos;
    }

    public void setRepos(List<?> repos) {
        this.repos = repos;
    }
}

Результат будет таким:

Type of variable in classA : java.util.ArrayList
Type of data inside the list : java.lang.String
A
B

Duplicates: Get generic type of class at runtime

Этот пример демонстрирует, что любой список может содержать объекты любых классов:

    List<String> stringList = new ArrayList<>();
    List list = stringList;
    list.add(new Object());
    for (String s : stringList) {
        System.out.println(s);
    }

Единственное, что вы можете сделать - это протестировать классы элементов, если они есть в списке.

Другие вопросы по теме