Подтвердить что ты не робот

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)

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

  • Объявление внутреннего статического класса (I надеюсь, что вы можете сделать это и в Groovy)
  • передача this в создании экземпляр ContentEntry...:)