Groovy 是否可以直接引用使用@builder声明的生成器类?

Groovy 是否可以直接引用使用@builder声明的生成器类?,groovy,compiler-errors,Groovy,Compiler Errors,以下Groovy脚本无法编译: import groovy.transform.builder.Builder @Builder class Foo { String bar } Foo.FooBuilder aBuilder = Foo.builder() 编译错误是: 错误:(8,16)Groovyc:无法解析类Foo.FooBuilder 这是预期的行为吗?有什么已知的解决办法吗 Groovy版本:2.5.2(我也检查了2.4.12和2.4.15)这是正确的。线路 Foo.F

以下Groovy脚本无法编译:

import groovy.transform.builder.Builder

@Builder
class Foo {
    String bar
}

Foo.FooBuilder aBuilder = Foo.builder()
编译错误是:

错误:(8,16)Groovyc:无法解析类Foo.FooBuilder

这是预期的行为吗?有什么已知的解决办法吗


Groovy版本:2.5.2(我也检查了2.4.12和2.4.15)

这是正确的。线路

Foo.FooBuilder aBuilder = Foo.builder()
将在尝试解析所有预期类型(左侧声明的类型)的阶段失败。此阶段在生成
FooBuilder
类之前执行-这就是为什么编译器抱怨不存在
FooBuilder
类(它只是还没有生成)

变通办法 这个问题有一个简单的解决方法-使用
def
和类型推断来通过语义分析阶段,让编译器生成
FooBuilder

import groovy.transform.builder.Builder

@Builder
class Foo {
    String bar
}

def aBuilder = Foo.builder()

println aBuilder.dump()
作为旁注-有一种方法可以使
Foo.FooBuilder aBuilder=Foo.builder()
通过静态分析阶段。如果跳过声明
Foo.FooBuilder
类型

import groovy.transform.builder.Builder

@Builder
class Foo {
    String bar
}

//Foo.FooBuilder aBuilder = Foo.builder()

并使用
groovyc
编译器编译这个类,它将生成
Foo.class
以及
Foo$FooBuilder.class
。然后,如果您取消对引发编译异常的行的注释并运行脚本,它将编译并运行,而不会出现任何问题。诀窍在于Groovy编译器编译
Foo.FooBuilder
类(并将其保存为
Foo$FooBuilder.class
文件),因此当您运行脚本并且静态分析试图解析它时,它在当前类路径中可用。在这种情况下,语义分析阶段不会报告前面遇到的错误。然而,我提到它只是作为一个有趣的事实,而不是一个解决办法,因为它很难处理。在这种情况下,使用
def
关键字并依赖类型推断效果最好。

感谢您的解释。我认为这与编译阶段的顺序有关。使用def对我的情况没有帮助。我在问题中发布的代码片段是显示该问题的最小示例。我想将Foo.FooBuilder类用于带有@Delegate注释的字段,它不适用于def。与我在Java构建器中使用它来扩展它们的方法相同,我使用它来制作一个方便的DSL,用于在测试中创建对象树。不确定是否可以重新安排阶段以允许此操作。我在Groovy问题跟踪器上提出了一个错误: