Я думаю, что это о типах.
Поле classLevel
имеет анонимный тип (подтип Any
, созданный выражением объекта). Этот тип имеет метод invoke()
.
Однако этот тип не виден за пределами класса. Таким образом, если свойство имеет метод получения (то есть оно не является частным), метод получения не может возвращать анонимный тип; он должен возвращать ближайший именованный тип, который является Any
. И Any
не имеет invoke()
метода.
Я не уверен, будет ли код в классе использовать метод получателя, если он доступен, или тип базового поля должен точно соответствовать типу получателя, если таковой имеется. Но в любом случае, очевидно, что если есть метод получения, ссылка на classLevel
внутри класса дает вам ссылку Any
, и поэтому вы не можете вызвать invoke()
для нее. (И вы не можете уменьшить ссылку на ваш тип объекта, который имеет invoke()
, потому что у этого типа нет имени.)
Одним из решений, как вы нашли, является сделать поле закрытым; это удаляет получатель и позволяет его базовому типу быть фактическим типом объекта, поэтому invoke()
тогда доступен для вызова.
Другой вариант - определить именованный тип для реализуемого объекта.