我可以将模板化 class 中的 class 文字作为注释的参数传递吗?

Can I pass a class literal from a templated class as an argument for an annotation?

我有一个注释,它以 Class<?> 作为值(来自 springfox 的 @ApiResponse 的响应字段)。我想要映射的响应是模板化的 class (PageDTO<T>) 但我无法为我的特定实体获取 class 文字,例如PageDTO<BusinessClass>.class。 唯一可行的选项是定义另一个 class:

class Doc extends PageDTO<BusinessClass> 

并将Doc.class的值作为参数传递。

有没有一种方法可以在不为每个注释方法定义 class 的情况下实现相同的结果?

我试过双投法:

(Class<PageDto<BusinessClass>>)(Class<?>)PageDTO.class 

但是没有用。

Class 确实表示单个 class,PageDTO<BusinessClass> 不是 class 它是 PageDTO class 的参数化泛型类型BusinessClass class 参数。 (参见 java.lang.reflect.ParameterizedType/java.lang.reflect.Type

所以答案是:这是不可能的。

这里最大的问题是你想使用注释,否则你可以使用与 GSON 库中的 TypeToken 类似的语法(或者只是使用它),但是对于注释你需要创建正常的命名 class为此。

你真的需要那种类型吗?你不能从其他地方读到它吗? (我对 springfox 不熟悉)也许 return 类型?
否则,您可以尝试为 class 和可选参数创建更高级的注释,但这也远非完美 - 因为您将无法处理嵌套的泛型类型或通配符。
其他选择是使用字符串来表示泛型类型,但它不是类型安全的,您需要或编写一些库来将其解析回 java.lang.reflect.Type