我有以下三个类,它们都相互形成继承层次结构:
@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
有什么想法我会在这里出错吗?