使用 Mapstruct 时,我可以使用
@TargetType
注释检索目标字段的类,如下所示:
<T extends Enum<T>> T mapToEnum(String input, @TargetType Class<T> type) {
// ...
}
如果我的目标确实是所需的枚举,那么这非常有用。但是,当我的目标是通用类时,例如如果是 Collection,那么 Mapstruct 不会将所需的类传递给参数,而是会生成
T.class
,这显然无法编译。
处理泛型时是否有另一种方法来检索目标类(在本例中为 Enum 类)?
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 代码周围添加一些包装器以添加泛型。