2010-01-11 21 views
12

Groovy sınıfı ile yapıcıları kullanırken bir sorun yaşıyorum.Groovy constructors

Data.groovy isimli bir dosyada ContentEntry iç sınıfında bir sınıf var. Data. ContentEntry ile

static void initContent(nid, uid) 
{ 
    curContent = new ContentEntry() 
    curContent.nid = nid; 
    curContent.uid = uid; 
} 

olarak tanımlanan:

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 

Ama projeyi çalıştırırken bana aşağıdaki hatayı veriyor:

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) 

O var ben Data yönteminden ContentEntry örneklerini başlatmak istiyor Kurucular, bir parametre olarak geçirilen dış sınıfın bir örneğini örtük olarak gerektiriyormuş gibi. Merak ediyorum neden ..

+0

3 yemek anwers teşekkür, hepinizi dile getirdi .. Java programlama 6 yıl içinde örtük referans hakkında bu şeyi hiç bilmiyordum. Onları statik olarak beyan edemediğinizden, onları normal sınıflar olarak ilan ettim. – Jack

cevap

9

tüm (statik olmayan) iç sınıflar, dış sınıfına ilişkin bir referansın mi gereksinimi yerine Groovy daha Java tarafından empoze edilmektedir. Eğer statik olmayan yönteminden iç sınıf örneğini, başvuru this ayarlanmalıdır. Ancak, statik bir yöntemle this referansı yoktur. İç sınıf statik Yap statik olmayan yöntemle

  • gelen iç sınıf örneğini

    • :

      sorunu ya düzeltmek için. Sonra onu herhangi bir yerden başlatabilirsin (ama artık dış sınıfın bir örneğine referans olmayacak).
  • 4

    Elbette yapıcının dış sınıfın bir örneğine ihtiyacı var. Bu yüzden iç sınıf var: sadece bir dış sınıfta yaşamak. Dış sınıfının dışındaki bir iç sınıfı anlatamazsın. Java'da

    +0

    buna dikkat etmek önemli olduğunu Java ve farklı burada Groovy hareket: Groovy Eğer açık bir argüman olarak geçmesi gerekiyor ise dış sınıf örneği, örtük geçirilen Java'da! –

    +0

    Gizmo'nun ne dediğine eklemek için, içerik sınıfının 'statik' olması da yararlı olabilir. –

    +0

    @Joachim: Bunu yapmaya çalıştığınızda, o bana söyler: böyle yapıcı (ayrıca, bu 1.7.1 giderilmiştir edilmemiştir?) – Matthias

    2

    aynı olur, ancak bir iç örneğini zaman gizli parametresini dahil etmek gerekmez.

    iki şeyden birini deneyin:

    1. iç sınıfı statik ilan (Ben yapabileceğiniz umut o Groovy çok)
    2. ContentEntry örneğinin oluşturulması this geçen ...:)