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
    }

但这不能编译。这可以实现吗?我能做的最接近的事情:

  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
        }
    

    我不喜欢这个,因为我想有相同的名字。

  2. 显式创建 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()