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)
Мне нравится, если конструкторы неявно нуждаются в экземпляре внешнего класса, переданного в качестве параметра. Мне интересно, почему..
Ответы
Ответ 1
Требование, чтобы все (нестатические) внутренние классы нуждались в ссылке на свой внешний класс, налагали Java, а не Groovy. Если вы создаете экземпляр внутреннего класса из нестатического метода, ссылка должна быть установлена на this
. Однако в статическом методе нет ссылки this
.
Чтобы устранить проблему:
- Создавать внутренний класс из нестатического метода
- Сделать внутренний класс статическим. Затем вы можете создать экземпляр из любого места (но он больше не будет ссылаться на экземпляр внешнего класса).
Ответ 2
Конечно, конструктору нужен экземпляр внешнего класса. Вот почему существует внутренний класс: жить только внутри внешнего класса. Вы не можете инициировать внутренний класс вне своего внешнего класса.
Ответ 3
В Java происходит то же самое, но когда вы создаете экземпляр внутреннего экземпляра, вам не нужно включать скрытый параметр.
Попробуйте одну из двух вещей:
- Объявление внутреннего статического класса (I
надеюсь, что вы можете сделать это и в Groovy)
- передача
this
в создании
экземпляр ContentEntry
...:)