2010-01-11 2 views
12

У меня проблема при использовании конструкторов с классом 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) 

Пришло например, если конструкторы неявно нуждаются в экземпляре внешнего класса, переданного в качестве параметра. Мне интересно, почему ..

+0

3 food anwers спасибо, поддержали всех вас .. В течение 6 лет программирования Java никогда не знал эту вещь о неявной ссылке. Я исправил это, объявив их обычными классами, так как вы не можете объявить их статичными в groovy. – Jack

ответ

9

Требование, чтобы все (нестатические) внутренние классы нуждались в ссылке на их внешний класс, налагали Java, а не Groovy. Если вы создаете экземпляр внутреннего класса из нестатического метода, ссылка должна быть установлена ​​на this. Однако в статическом методе нет ссылки this.

Чтобы устранить эту проблему, либо:

  • Инстанцировать внутренний класс от не статического метода
  • сделать внутренний класс статическим. Затем вы можете создать экземпляр из любого места (но он больше не будет ссылаться на экземпляр внешнего класса).
4

Конечно, конструктору нужен экземпляр внешнего класса. Вот почему существует внутренний класс: жить только внутри внешнего класса. Вы не можете управлять внутренним классом вне своего внешнего класса.

+0

Важно отметить, что Java и Groovy действуют по-разному: в Java экземпляр внешнего класса передается неявно, а в Groovy вам нужно передать его как явный аргумент! –

+0

Чтобы добавить к сказанному gizmo, сделать класс контента 'static' тоже полезным. –

+0

@Joachim: когда я пытаюсь это сделать, он говорит мне: никакого такого конструктора (также, разве это не было исправлено в 1.7.1?) – Matthias

2

В Java происходит то же самое, но когда вы создаете экземпляр внутреннего экземпляра, вам не нужно включать скрытый параметр.

Попробуйте один из двух вещей:

  1. объявить внутренний класс статический (я надеюсь, что вы можете сделать это в Groovy тоже)
  2. проходя this в создании экземпляра ContentEntry ...:)
Смежные вопросы