2010-01-11 55 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實例...: )