【问题标题】:Java : How to get type of List<?> [duplicate]Java:如何获取 List<?> 的类型 [重复]
【发布时间】:2019-04-19 14:03:18
【问题描述】:

我正在研究 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 代表一个对象,但您不知道是哪一个。它们只是键 + 值的列表。

【问题讨论】:

  • 你试过ClassA.getMyList().get(0).getClass() ??
  • 你不能。类型擦除。 ClassA 应该是通用的。 class ClassA&lt;T&gt; { private List&lt;T&gt; myList; }
  • @Michael 但如果你从List 中的任何元素执行getClass(),你会得到它,不是吗?
  • @Paplusc 如果是List&lt;Object&gt; 怎么办?第一个元素可以是字符串,第二个可以是整数,第三个可以是 HashMap。获取第一个元素的类并不能告诉你太多。
  • @Michal 没错,我没想到这种可能性。

标签: java generics reflection wildcard


【解决方案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);
       }
    }

}

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

【讨论】:

    【解决方案2】:

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

    您唯一能做的就是测试元素的类(如果列表包含任何元素)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2011-09-13
      • 1970-01-01
      • 2020-06-24
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多