Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin-可变子类的扩展属性设置器_Kotlin_Properties_Extension Methods - Fatal编程技术网

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]=值
    }
    
    我不喜欢这个,因为我想有相同的名字

  • 显式创建getter和setter:

    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()