设置 kotlin 扩展
Setting a kotlin extension
我不确定是否可以将 kotlin 扩展设置为 java 对象。
在我的程序中,我有一个名为 Submission
的 java class,我想创建一个名为 categories
的 kotlin 扩展 - 一个 ArrayList - 所以我做了像这样。
var Submission.categories: ArrayList<String>
get() {
return this.categories
}
set(categories){
this.categories = categories
}
然而,每当我尝试设置一个类别时,程序就会崩溃并出现这样的 WhosebugError:
ERR: stack=java.lang.WhosebugError: 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 扩展的正确语法。所以我真的不确定我应该朝哪个方向解决这个问题。也许我真的应该只使用普通的旧继承?
谢谢。
您的代码抛出 WhosebugError
因为它递归地调用自身。 this.categories
调用它已经存在的 getter 而 this.categories = categories
调用它已经存在的 setter。
扩展属性只是一对(扩展)getter 和 setter 的语法糖。在 属性 访问器(即 getter 和 setter)中,您只能访问已经 public
可以从接收器 class 访问的内容。如果它有 public 个字段,您可以访问它们,但是您不能定义新字段。如果你想保存额外的状态,但 class 没有 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
}
我不确定是否可以将 kotlin 扩展设置为 java 对象。
在我的程序中,我有一个名为 Submission
的 java class,我想创建一个名为 categories
的 kotlin 扩展 - 一个 ArrayList - 所以我做了像这样。
var Submission.categories: ArrayList<String>
get() {
return this.categories
}
set(categories){
this.categories = categories
}
然而,每当我尝试设置一个类别时,程序就会崩溃并出现这样的 WhosebugError:
ERR: stack=java.lang.WhosebugError: 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 扩展的正确语法。所以我真的不确定我应该朝哪个方向解决这个问题。也许我真的应该只使用普通的旧继承?
谢谢。
您的代码抛出 WhosebugError
因为它递归地调用自身。 this.categories
调用它已经存在的 getter 而 this.categories = categories
调用它已经存在的 setter。
扩展属性只是一对(扩展)getter 和 setter 的语法糖。在 属性 访问器(即 getter 和 setter)中,您只能访问已经 public
可以从接收器 class 访问的内容。如果它有 public 个字段,您可以访问它们,但是您不能定义新字段。如果你想保存额外的状态,但 class 没有 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
}