0

我有以下三个类,它们都相互形成继承层次结构:

@Canonical
class Widget {
    String author
}

@Canonical
@TupleConstructor(includeSuperProperties = true, callSuper = true)
class FileWidget extends Widget {
    File file
}

interface HasImage {
    BufferedImage getImage()
}

@Canonical
@TupleConstructor(includeSuperProperties = true, callSuper = true)
class ImageFileWidget extends FileWidget implements HasImage {
    Boolean hasColor
    BufferedImage image
}

现在我可能正在使用@Canonical和/或@TupleConstructor不正确,但这里所需的行为是要求实例化一个ImageFileWidget使用它的所有属性以及它的父对象的属性。所以像:

class Driver {
    static void main(String[] args) {
        String author = 'me'
        File file = new File('some/path')
        Boolean hasColor = true
        BufferedImage image = null

        ImageFileWidget imageFileWidget = new ImageFileWidget(author, file, hasColor, image)
    }
}

但是当我从 Eclipse 内部运行它时,我得到:

Caught: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.me.myapp.ImageFileWidget(java.lang.String, java.io.File, java.lang.Boolean, null)

groovy.lang.GroovyRuntimeException:在 com.me.myapp.Driver 找不到匹配的构造函数:com.me.myapp.ImageFileWidget(java.lang.String, java.io.File, java.lang.Boolean, null)。主要(驱动程序.groovy:10)

此外,当我这样打印时ImageFileWidget.constructors

printn ImageFileWidget.constructors

我得到:

[
    public com.me.myapp.ImageFileWidget(),
    public com.me.myapp.ImageFileWidget(java.lang.Boolean),
    public com.me.myapp.ImageFileWidget(java.lang.Boolean,java.awt.image.BufferedImage)
]

...但是,当我从 Gradle 内部(通过应用程序插件)运行它时,一切正常(我为我生成了正确的构造函数,并且没有抛出异常)...

因此,Groovy 似乎不尊重我对或类似的includeSuperProperties论点。@TupleConstructor有什么想法我会在这里出错吗?

4

0 回答 0