Groovy构造函数

时间:2010-01-11 16:37:14

标签: groovy constructor

使用带有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)

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

3 个答案:

答案 0 :(得分:9)

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

要解决问题:

  • 从非静态方法实例化内部类
  • 使内部类静态。然后你可以从任何地方实例化它(但它将不再引用外部类的实例)。

答案 1 :(得分:4)

当然构造函数需要外部类的实例。这就是内在阶级存在的原因:只存在于外部阶级中。你不能在其外部类之外实现内部类。

答案 2 :(得分:2)

在Java中也是如此,但是当您实例化内部实例时,您不必包含隐藏参数。

尝试以下两种方法之一:

  1. 声明内部类静态(我 希望你也可以在Groovy中做到这一点)
  2. 在创建时传递this ContentEntry实例......:)