3

我不确定是否可以像 java 对象一样设置 kotlin 扩展。

在我的程序中,我有一个名为的 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 扩展的正确语法。所以我真的不确定我应该在哪个方向解决这个问题。也许我真的应该只使用普通的旧继承?

谢谢。

4

1 回答 1

4

您的代码抛出 aStackOverflowError因为它递归地调用自己。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
    }
于 2016-12-19T13:46:18.977 回答