Kotlin - 可变子类的扩展 属性 setter
Kotlin - extension property setter for mutable subclass
假设我想为 List
设置一个 属性,然后将此 属性 扩展为 setter 为 MutableList
。例如,我希望列表中的最后一个元素有一个 getter,如果列表是可变的,我还想有一个 setter。所以我想要以下内容:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myLast: T
set(value) {
this[this.size - 1] = value
}
但这不能编译。这可以实现吗?我能做的最接近的事情:
声明另一个属性:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myMutableLast: T
get() = this.last()
set(value) {
this[this.size - 1] = value
}
我不喜欢这个,因为我想有相同的名字。
显式创建 getter 和 setter:
fun<T> List<T>.getMyLast() = this.last()
fun<T> MutableList<T>.setMyLast(value : T) {
this[this.size - 1] = value
}
我不喜欢它,因为它没有 属性 语法。
只需在调用第一个的第二个 属性 中添加一个 getter:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myLast: T
@JvmName("someName")
get() = (this as List<T>).myLast
set(value) {
this[this.size - 1] = value
}
在这种情况下,您同样可以这样做 get() = this.last()
,但这样更改第一个定义会自动影响第二个定义。
它会像方法重载一样得到解决,例如
val x: List<String> = mutableListOf("")
val y: MutableList<String> = mutableListOf("")
x.myLast // calls List<T>.myLast.get()
y.myLast // calls MutableList<T>.myLast.get()
假设我想为 List
设置一个 属性,然后将此 属性 扩展为 setter 为 MutableList
。例如,我希望列表中的最后一个元素有一个 getter,如果列表是可变的,我还想有一个 setter。所以我想要以下内容:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myLast: T
set(value) {
this[this.size - 1] = value
}
但这不能编译。这可以实现吗?我能做的最接近的事情:
声明另一个属性:
val <T> List<T>.myLast get() = this.last() var <T> MutableList<T>.myMutableLast: T get() = this.last() set(value) { this[this.size - 1] = value }
我不喜欢这个,因为我想有相同的名字。
显式创建 getter 和 setter:
fun<T> List<T>.getMyLast() = this.last() fun<T> MutableList<T>.setMyLast(value : T) { this[this.size - 1] = value }
我不喜欢它,因为它没有 属性 语法。
只需在调用第一个的第二个 属性 中添加一个 getter:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myLast: T
@JvmName("someName")
get() = (this as List<T>).myLast
set(value) {
this[this.size - 1] = value
}
在这种情况下,您同样可以这样做 get() = this.last()
,但这样更改第一个定义会自动影响第二个定义。
它会像方法重载一样得到解决,例如
val x: List<String> = mutableListOf("")
val y: MutableList<String> = mutableListOf("")
x.myLast // calls List<T>.myLast.get()
y.myLast // calls MutableList<T>.myLast.get()