Groovy конструкторы - PullRequest
       14

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

12 голосов
/ 11 января 2010

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

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

Ответы [ 3 ]

9 голосов
/ 11 января 2010

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

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

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

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

2 голосов
/ 11 января 2010

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

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

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