gpt4 book ai didi

kotlin - Kotlin-可变子类的扩展属性 setter

转载 作者:行者123 更新时间:2023-12-02 13:21:22 26 4
gpt4 key购买 nike

假设我想为List提供一个属性,然后使用MutableList的setter扩展此属性。例如,我想让列表中的最后一个元素有一个 setter/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
    }

    我不喜欢它,因为它没有属性语法。
  • 最佳答案

    只需在第二个属性中添加一个 setter/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()

    关于kotlin - Kotlin-可变子类的扩展属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55314687/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com