Установка расширения котлина

Я не уверен, возможно ли установить расширение kotlin как java-объект.

В моей программе у меня есть класс java под названием Submission и я хотел создать расширение kotlin для названных categories – ArrayList, поэтому я сделал это так.

 var Submission.categories: ArrayList<String> get() { return this.categories } set(categories){ this.categories = categories } 

Однако всякий раз, когда я пытаюсь установить категорию, программа просто падает с помощью stackOverflowError следующим образом:

 ERR: stack=java.lang.StackOverflowError: stack size 8MB at com.....setCategories(Extensions.kt:0) at com.....setCategories(Extensions.kt:19) at com.....setCategories(Extensions.kt:19) at com.....setCategories(Extensions.kt:19) at com.....setCategories(Extensions.kt:19) at com.....setCategories(Extensions.kt:19) 

Это похоже на правильный синтаксис для объявления расширений kotlin. Поэтому я действительно не уверен в том, в каком направлении я должен пойти, чтобы исправить это. Возможно, я должен просто использовать обычное старое наследование?

Благодарю.

Ваш код выдает StackOverflowError потому что он называет себя рекурсивно. this.categories просто вызывает геттер, в котором он уже находится, и this.categories = categories вызывает сеттер, в котором он уже находится.

Свойства расширения – это только синтаксический сахар для пары (расширения) геттеров и сеттеров. Внутри аксессуаров свойств (т. Е. Получателя и сеттера) вы можете получить доступ только к тому, что уже доступно для доступа из класса приемника. Если у него есть общедоступные поля, вы можете получить к ним доступ, однако вы не можете определить новые поля. Если вы хотите сохранить дополнительное состояние, но у класса нет API для этого, вам не повезло.

Обычно свойство изменчивого расширения обычно перенаправляется на существующие мутирующие функции. Вот пример.

 //java class Foo { private List<String> items; public String myItems() { return items; } } //kotlin var Foo.firstItem: String get() = myItems()[0] set(value) { myItems()[0] = value }