设置 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
    }