我不确定kotlin扩展是否可以像java对象一样设置。
在我的程序中,我有一个名为Submission
的java类,我想创建一个名为categories
的kotlin扩展 - 一个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扩展的正确语法。所以我真的不确定我应该采取什么方向来解决这个问题。也许我应该只使用普通的旧继承?
感谢。
答案 0 :(得分:4)
您的代码会抛出StackOverflowError
,因为它会递归调用自身。 this.categories
只调用它已经存在的getter,this.categories = categories
调用它已经存在的setter。
扩展属性只是一对(扩展)getter和setter的语法糖。在属性访问器(即getter和setter)中,您只能访问接收器类中已经public
可访问的内容。如果它有公共字段,您可以访问它们,但是您无法定义新字段。如果你想保存额外的状态但该类没有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
}