从@TargetType获取泛型类型

问题描述 投票:0回答:1

使用 Mapstruct 时,我可以使用

@TargetType
注释检索目标字段的类,如下所示:

<T extends Enum<T>> T mapToEnum(String input, @TargetType Class<T> type) {
    // ...
}

如果我的目标确实是所需的枚举,那么这非常有用。但是,当我的目标是通用类时,例如如果是 Collection,那么 Mapstruct 不会将所需的类传递给参数,而是会生成

T.class
,这显然无法编译。

处理泛型时是否有另一种方法来检索目标类(在本例中为 Enum 类)?

java mapstruct
1个回答
0
投票

Java 大多不支持具体化泛型。编译器会摆脱它。例如,如果您的

T
List<String>
,那么在运行时剩下的就是
List

有一种方法可以获取泛型类型(这就是为什么我说大多数),但仅限于显式填充泛型类型的字段、参数、返回类型和超级类型。例如,

class MyList extends ArrayList<String>
允许您得到
ArrayList<String>
并通过
String
使用
Class.getGenericSuperclass()

一些 API 对此有特殊支持,例如 Jackson 及其

TypeReference
。这些允许您创建一个匿名子类(例如
new TypeReference<List<String>> {}
),以便保留通用类型。我认为
MapStruct
不会。阅读文档让我觉得你可以简单地使用
Collection.class
List.class
。如果没有,您要么必须(部分)使用原始类型,要么在 MapStruct 代码周围添加一些包装器以添加泛型。

© www.soinside.com 2019 - 2024. All rights reserved.