Java:如何获取 List<?> 的类型

Mr.*_*r.G 6 java generics reflection wildcard

我正在研究java中的反射。我知道这是一个常见问题,并且有很多关于它的文章,但我有点困惑,似乎无法找到适合我想要实现的目标的正确解决方案。

我有 :

public class ClassA {
    private List<?> myList;
    // getters, setters
}
Run Code Online (Sandbox Code Playgroud)

“myList”将包含对象列表(DTO):

List<?> myList; // could be List<DTO1> or List<DTO2> ...
Run Code Online (Sandbox Code Playgroud)

我正在尝试从另一个类获取列表的类型,如下所示:

public class ClassB {
    public void myMethod() {
        // get type of ClassA.getMyList()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 getClass()、getType() 之类的东西时,我只能得到“ArrayList”...尝试获取列表中元素的类会导致“LinkedHashMap”。

我真的想通过使用列表的通配符类型来实现这一点。

那么有没有一种方法可以用最少的代码获取 myList 的类型?


编辑 :

谢谢大家的答案。

只有一件事:myList包含 type 的元素LinkedHashMap,这在我的帖子中不是很清楚。

看来这确实是做不到的。每一个都LinkedHashMap代表一个对象,但你不知道是哪一个。它们只是键+值的列表。

flo*_*der 1

你可以试试这个。我不知道它是否能解决您的目的,但可能会有所帮助。

 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);
       }
    }

}
Run Code Online (Sandbox Code Playgroud)

ClassA会是这样的

import java.util.List;

public class ClassA {
    private List<?> repos;

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

    public void setRepos(List<?> repos) {
        this.repos = repos;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出将是这样的:

Type of variable in classA : java.util.ArrayList
Type of data inside the list : java.lang.String
A
B
Run Code Online (Sandbox Code Playgroud)