设置kotlin扩展名

我不确定是否有可能将kotlin扩展设置为java对象。

在我的程序中,我有一个名为Submission的java类,我想创建一个名为categories的kotlin扩展 – 一个ArrayList – 所以我这样做了。

 var Submission.categories: ArrayList 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扩展。 所以我真的不确定我应该怎样去解决这个问题。也许我真的应该使用普通的旧的inheritance?

谢谢。

你的代码会抛出一个StackOverflowError因为它会自动调用它自己。 this.categories只调用它已经在的getter, this.categories = categories调用它已经在的setter。

扩展属性只是一对(扩展)getter和setter的语法糖。 在属性访问器(即getter和setter)中,只能访问已经从接收者类public访问的内容。 如果它具有公共字段,则可以访问它们,但不能定义新的字段。 如果你想保存更多的状态,但是这个类没有这个API,那你就不好运气了。

一个可变的扩展属性通常做的是重定向到现有的变异函数。 这是一个例子。

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