Оператор рефлексии Котлина получает реализацию

Я изучаю Kotlin, используя Fedora 25 OpenJDK 8 и Kotlin 1.1.

Я скопировал пример с сайта Kotlin: https://kotlinlang.org/docs/reference/delegated-properties.html и изменил оператор get.

class Example { var p: String by Delegate() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { // My implementation return property.getter.call(thisRef) as String } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } } 

Читая документацию Reflection, геттер ожидает экземпляр объекта и никакого другого параметра, но я достиг только следующей ошибки. (Ошибка аббревиатура, потому что она слишком большая, она находится в рекурсии).

 . . . at info.malk.Example.getP(Delegation.kt) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at kotlin.reflect.jvm.internal.FunctionCaller$Method.callMethod(FunctionCaller.kt:98) at kotlin.reflect.jvm.internal.FunctionCaller$InstanceMethod.call(FunctionCaller.kt:115) at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:107) at info.malk.Delegate.getValue(Delegation.kt:32) at info.malk.Example.getP(Delegation.kt) . . . Caused by: java.lang.reflect.InvocationTargetException ... 1024 more Caused by: java.lang.StackOverflowError ... 1024 more Process finished with exit code 1 

Помогите.

Правило перевода говорит:

Например, для свойства prop генерируется скрытый свойство prop$delegate , а код аксессоров ( getter / setter ) просто делегирует это дополнительное свойство.

поэтому свойство kotlin отправит получателя / сеттера в delegator . когда вы получаете / устанавливаете значение свойства в обработчиках делегатов ( getValue / setValue ), результат будет рекурсивным.

вашему Delegate больше нравится:

 class Delegate<T> { private var value: T? = null; // ^--- store the proeprty value internal operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return value ?: throw UninitializedPropertyAccessException(); } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value; } } 
Intereting Posts
Создать коллекцию из другого в kotlin Проверьте, работает ли моя активность в MultiWindowMode или не используется Kotlin Basic Realm + Kotlin: RealmObject не устанавливает переданные значения Как сделать multiconditional для цикла в kotlin Kotlin 1.0.0-rc-1036 проблемы с обработкой аннотации Как я могу отобразить свое представление anko без вызова overriding onCreate? Ошибка связанного обслуживания с помощью «Context.startForegroundService () не вызвала ошибку Service.startForeground ()» Захват объектов с помощью JMockit и Kotlin только один сопутствующий объект разрешен для каждого класса в Котлине Связывание данных с Kotlin приводит к ресурсу $ NotFoundException Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android RxJava: onBackpressureBlock () странное поведение Пользовательский TypeFace в Kotlin Программно Okhttp3-запрос, возвращающий пустой ответ, а также разные заголовки, чем Postman Kotlin + Spring загрузка запроса сортировки