2010-01-11 49 views
12

我在使用具有Groovy类的构造函数时遇到问题。Groovy构造函数

我有一个类Data在一个文件Data.groovy与内部类ContentEntry。我想从一个Data方法初始化ContentEntry实例:

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) 

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

+0

3食物anwers谢谢,upvoted大家..在Java编程的6年从来不知道这个事情关于隐式引用。我修正它将它们声明为普通类,因为你不能在groovy中声明它们是静态的。 – Jack 2010-01-12 00:24:51

回答

9

所有(非静态)内部类需要对其外部类的引用的要求是由Java规定的,而不是由Groovy规定。如果您从非静态方法实例化内部类,则应该将参考设置为this。但是,静态方法中不存在this引用。

要解决的问题或者:

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

当然,构造函数需要一个外部类的实例。这就是内部阶层存在的原因:只能在外部阶层中生活。你不能在它的外部类之外实例化一个内部类。

+0

需要注意的是,Java和Groovy在这里的作用是不同的:在Java中,外部类实例是隐式传递的,而在Groovy中,您需要将它作为显式参数传递! – 2010-01-11 16:50:14

+0

要添加到Gizmo所说的内容类中,使静态内容类可能也有帮助。 – 2010-01-11 16:50:42

+0

@Joachim:当我尝试这样做时,它告诉我:没有这样的构造函数(也没有在1.7.1中解决这个问题?) – Matthias 2011-02-18 17:36:27

2

在Java中发生的情况相同,但是当您实例化一个内部实例时,您不必包含隐藏参数。

尝试以下两种情况之一:

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