【问题标题】:How to create a parametrised type in java with a type variable?java - 如何使用类型变量在java中创建参数化类型?
【发布时间】:2021-02-04 00:18:02
【问题描述】:

问题标题可能具有误导性,但我不知道如何更好地总结我想要完成的内容。所以请通读这个正文,以了解我想要实现的目标。

我有一个带有类型参数的方法,它可以获取一些类(例如 MyClass)。我需要创建一个 Type 的 List 并返回它。

我认为这段代码可以解决我的问题。但实际行为让我感到惊讶。

    public <T> Type getListClass(Class<T> cls) {
    Type type = new TypeToken<ArrayList<T>>() {}.getType();
    return type;
}

实际代码:

调试器:

我们检查 type2,我们可以看到它的 rawType 为 Arraylist 和 typeArgument 为 Integer 。同样,我想用我的泛型类型发生。

但是在变量 type 中,我们观察到 Arraylist 的 rawType 和 T 的 typeArgument。相反,我希望它是一个具体的类(如 IntegerMyCLass)。基本上我需要一个通用的List Type,但在执行时具体。有办法实现吗?

-----编辑 1-----

这不是这个问题的重复:Get generic type of class at runtime 那里的答案与我的代码产生的结果相同。

【问题讨论】:

标签: java class generics reflection types


【解决方案1】:

由于类型擦除,getListClass 内部的T 参数在运行时不可用,但您可以使用TypeToken.where(来自Guava)使用cls 构建类型:

public <T> Type getListClass(Class<T> cls) {
    Type type = new TypeToken<ArrayList<T>>() {}.where(new TypeParameter<T>() {}, cls).getType();
    return type;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2021-07-17
  • 2011-08-02
  • 1970-01-01
  • 2016-06-20
相关资源
最近更新 更多