首页 > 解决方案 > 构建上限通配符的 ByteBuddy 配方是什么?

问题描述

我知道其中的一些,但不是全部。最值得注意的是,我知道TypeDescription.Generic.Builder但我有一个非常具体的问题。

假设我要构建Supplier<? extends Frob<X>>.

进一步假设我所知道的只是TypeDefinition参数的 a,但我不知道它代表什么(在上面的示例中它代表Frob<X>)。也就是说,我不知道TypeDefinition我拥有的是类、参数化类型、泛型数组类型、类型变量、通配符还是其他任何东西;我只知道它是一个TypeDefinition.

显然,如果我想制作Supplier<Frob<X>>,我可以这样做:

TypeDescription.Generic.Builder.parameterizedType(TypeDescription.ForLoadedType.of(Supplier.class),
                                                  myTypeDefinition)
  .build();

…假设我没有在上面的代码段中输入任何拼写错误。

如何从适合作为参数化类型构建的“参数化”部分提供TypeDefinition的现有通配符中制作上限通配符?TypeDefinition有没有我忽略的明显配方,或者这是构建者的 DSL 中的一个差距?

(我知道asWildcardUpperBound()on 的方法TypeDescription.Generic.Builder,但是假设我有一个构建器可以使用,并且为了“引导”这样一个构建器,我TypeDescription至少需要给它一个。但我没有TypeDescription; 我有一个TypeDefinition可能被参数化的,我不想使用asErasure()。)

(我正在寻找一种方法TypeDescription.Generic.Builder.parameterizedType(myTypeDefinition).asWildcardUpperBound().build(),但我显然不能这样做。)

似乎确实有,TypeDescription.Generic.OfWildcardType.Latent::boundedAbove但我不知道这是否应该是“仅供内部使用”的类/方法。

标签: byte-buddy

解决方案


确实缺少这样的 API。我在今天的版本 (1.11.5) 中添加了一个 API,用于将现有的泛型类型描述转换为允许转换为数组或通配符的构建器。APITypeDescription.Generic.Builder.of接受加载或卸载的泛型类型描述。


推荐阅读