Kotlin-可变子类的扩展属性设置器
假设我想为Kotlin-可变子类的扩展属性设置器,kotlin,properties,extension-methods,Kotlin,Properties,Extension Methods,假设我想为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] =
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 List.myLast
get()=this.last()
var MutableList.myLast:T
设置(值){
this[this.size-1]=值
}
但这并没有编译。这能实现吗?我能做的最接近的事情:
val <T> List<T>.myLast
get() = this.last()
var <T> MutableList<T>.myMutableLast: T
get() = this.last()
set(value) {
this[this.size - 1] = value
}
val List.myLast
get()=this.last()
var MutableList.myMutableLast:T
get()=this.last()
设置(值){
this[this.size-1]=值
}
我不喜欢这个,因为我想有相同的名字fun<T> List<T>.getMyLast() = this.last()
fun<T> MutableList<T>.setMyLast(value : T) {
this[this.size - 1] = value
}
fun List.getMyLast()=this.last()
fun MutableList.setMyLast(值:T){
this[this.size-1]=值
}
我不喜欢它,因为它没有属性语法只需向调用第一个属性的第二个属性添加一个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
}
谢谢你的回答。您的意思是我首先声明
val List.myLast get()=this.last()
,然后声明您所写的内容吗?然后我得到了平台声明冲突:以下声明具有相同的JVM签名…:fun List。:…fun MutableList。:“。啊,是的,我忽略了在这种特定情况下会发生这种情况,因为List
和MutableList
映射到相同的类型。因此,您需要在其中一个getter上添加@JvmName
注释。
val x: List<String> = mutableListOf("")
val y: MutableList<String> = mutableListOf("")
x.myLast // calls List<T>.myLast.get()
y.myLast // calls MutableList<T>.myLast.get()