Конструкторы Groovy

У меня есть проблема при использовании конструкторов с классом Groovy.

У меня есть класс Data в названном файле Data.groovy с внутренним классом ContentEntry. Я хочу инициализировать ContentEntry экземпляры от a 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)

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

12
задан Jack 11 January 2010 в 16:37
поделиться

3 ответа

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

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

  • интунтинтировать внутренний класс из нестатического метода
  • сделать внутренний класс статическим. Тогда вы можете создать его в любом месте (но он больше не будет иметь ссылку на экземпляр внешнего класса).
9
ответ дан 2 December 2019 в 20:40
поделиться

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

4
ответ дан 2 December 2019 в 20:40
поделиться

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

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

  1. объявить внутренний класс статическим (I надеюсь, вы сможете сделать это и в Грувом)
  2. проходя это в создании экземпляр ContentEntry ... :)
2
ответ дан 2 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: