Я работаю над отражением в 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, вероятно, должен быть универсальным. class ClassA<T> { private List<T> myList; }
@Michael, но если вы сделаете getClass() из любого элемента в List, вы его получите, не так ли?
@Paplusc А что, если это List<Object>? Первый элемент может быть строкой, второй - целым числом, третий - HashMap. Получение класса первого элемента мало что вам скажет.
@Michal Верно, я не думал о такой возможности.




Вы можете попробовать это. Я не знаю, решит ли он вашу цель или нет, но, возможно, состоится.
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);
}
Единственное, что вы можете сделать - это протестировать классы элементов, если они есть в списке.
ClassA.getMyList().get(0).getClass()пробовали ??