Groovy构造函数

扫码查看

在将Groovy类与构造函数一起使用时遇到问题。

我在一个名为Data的文件中有一个Data.groovy类,带有一个内部类ContentEntry。我想从ContentEntry方法初始化Data实例:

static void initContent(nid, uid)
{
    curContent = new ContentEntry()
    curContent.nid = nid;
    curContent.uid = uid;
}
ContentEntry定义为:
class ContentEntry
{
    public int nid, uid
    private tags = [:]

    public ContentEntry()
    {

    }

    ContentEntry(int nid, int uid)
    {
        this.nid = nid
        this.uid = uid
    }

    //omitted rest of the class

但是,在运行项目时,它会给我以下错误:
Exception in thread "main" org.codehaus.groovy.runtime.metaclass.MethodSelectionException:
Could not find which method <init>() to invoke from this list:
public it.softit.Data$ContentEntry#<init>(it.softit.Data, int, int)
public it.softit.Data$ContentEntry#<init>(it.softit.Data)

就像构造函数隐式需要一个作为参数传递的外部类的实例一样。我想知道为什么。

最佳答案

Java(而不是Groovy)提出了所有(非静态)内部类都需要对其外部类的引用的要求。如果从非静态方法实例化内部类,则应将引用设置为this。但是,静态方法中没有this引用。

要解决此问题,请执行以下操作:

  • 从非静态方法
  • 实例化内部类
  • 使内部类静态。然后,您可以从任何地方实例化它(但是它将不再引用外部类的实例)。
  • 关于Groovy构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2043218/

    10-10 16:29
    查看更多