设置kotlin扩展名

时间:2016-12-19 12:47:13

标签: kotlin kotlin-extension

我不确定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扩展的正确语法。所以我真的不确定我应该采取什么方向来解决这个问题。也许我应该只使用普通的旧继承?

感谢。

1 个答案:

答案 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
    }