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

时间:2018-11-16 11:24:02

标签: java generics reflection wildcard

我正在用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()
    }
}

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

我真的很想通过使用通配符类型来实现此目的。

那么有什么办法可以用最少的代码获得myList的类型?


编辑:

谢谢大家的回答。

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

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

2 个答案:

答案 0 :(得分:0)

您可以尝试一下。我不知道它能否解决您的目的,但可能会有所帮助。

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

}

ClassA会是这样

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

答案 1 :(得分:0)

  

重复项:   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);
    }

您唯一可以做的就是-如果列表中包含元素,则测试元素的类。