设置kotlin扩展名

设置kotlin扩展名,kotlin,kotlin-extension,Kotlin,Kotlin Extension,我不确定kotlin扩展是否可以像java对象一样设置 在我的程序中,我有一个名为Submission的java类,我想创建一个名为categories的kotlin扩展—一个ArrayList—所以我这样做了 var Submission.categories: ArrayList<String> get() { return this.categories } set(categories){ this.categories

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

在我的程序中,我有一个名为
Submission
的java类,我想创建一个名为
categories
的kotlin扩展—一个ArrayList—所以我这样做了

var Submission.categories: ArrayList<String>
    get() {
        return this.categories
    }
    set(categories){
        this.categories = categories
    }
这似乎是声明kotlin扩展的正确语法。所以我真的不确定我应该朝什么方向去解决这个问题。也许我真的应该使用普通的旧继承


谢谢

您的代码会抛出一个
堆栈溢出错误
,因为它会递归地调用自身
this.categories
只调用它已经在其中的getter,而
this.categories=categories
调用它已经在其中的setter

扩展属性只是一对(扩展)getter和setter的语法糖。在属性访问器(即getter和setter)中,您只能访问已经可以从receiver类访问的
public
ly。如果它有公共字段,您可以访问它们,但不能定义新字段。如果您想保存其他状态,但该类没有用于该状态的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
    }
//java
福班{
私人清单项目;
公共字符串myItems(){
退货项目;
}
}
//科特林
var Foo.firstItem:字符串
get()=myItems()[0]
设置(值){
myItems()[0]=值
}

您没有在setter中的getter中定义任何自定义逻辑,那么为什么需要它们呢?该问题是由不正确的setter声明引起的,
this.categories=categories
将调用
set()
方法,这将导致无休止的循环。@Egor啊,这很有意义。我之所以定义get和set方法,是因为它拒绝在没有get方法和return语句的情况下编译。我认为这一套也是一样的,我也这么做了。我将尝试删除集合逻辑,看看会发生什么。即使在修改我的getter和setter以避免递归调用之后——正如您所指出的那样。StackOverflowerError只移动到get()。但是,如果我正确理解了您的帖子,那么无论如何这都不会起作用,因为
类别
在此程序中不是公共字段,我正在尝试定义一个新字段。我完全同意这个答案,但值得一提的是,虽然扩展无法修改类以添加支持字段,但额外的状态仍然可以存储在类之外的某个地方,委托可以在这里提供帮助。有关此解决方法的更多详细信息,请参阅:@hotkey感谢链接。可以肯定的是,这是否也适用于java类well@nmu,是的,它会的,您也可以为Java类定义Kotlin扩展。如果需要在Java中使用这些扩展,它们可以作为静态函数显示。例如,在
kotlinflee.kt
中为
MyClass
定义的
tag
扩展将被视为
kotlinfliekt.getTag(MyClass$receiver)
和类似的setter。我的答案中的代码片段实际上是一个Java类。
//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
    }