设置kotlin扩展名
我不确定kotlin扩展是否可以像java对象一样设置 在我的程序中,我有一个名为设置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
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
}