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