2017-06-02 2 views
0

Hier ist meine Funktion:Warum kann Kotlin die Operatormethode <*> nicht überschreiben?

operator infix fun List<Teacher>.get(int: Int): Teacher { 
    var t = Teacher() 
    t.name = "asd" 
    return t ; 
} 

und meine Nutzung:

b[0].teachers[1].name 

Tipp: b ist ein Objekt, das Liste < Teacher> Eigenschaft

und der Fehler Empty list doesn't contain element at index 1.

hat Warum funktioniert diese Override-Operator-Funktion nicht?

+3

Sie können eine Methode mit einer Erweiterung – voddan

Antwort

7

In Kotlin können Sie eine Elementfunktion mit einer Erweiterung nicht schattieren. Ein Mitglied gewinnt immer in der Anrufauflösung. Sie können also keine Erweiterung mit einer Signatur aufrufen, die der einer Elementfunktion entspricht, die in dem Typ vorhanden ist, der für den Ausdruck deklariert oder abgeleitet wurde.

class C { 
    fun foo() { println("member") } 
} 

fun C.foo() { println("extension") } 

C().foo() // prints "member" 

In Ihrem Fall wird die Member-Funktion abstract operator fun get(index: Int): E in kotlin.collections.List definiert.

Siehe Sprachreferenz: Extensions are resolved statically

0

Wie voddan im Kommentar erwähnt, eine Methode mit einer Erweiterung nicht beschatten können. Es gibt jedoch eine Möglichkeit, dies mit etwas Polymorphismus zu umgehen. Ich denke nicht, dass ich das in deinem Fall empfehlen würde, aber ich denke, es zeigt eine coole Kotlin-Funktion.

Wenn b[0] ein Objekt vom Typ zurückgibt B, können Sie dies in dieser Klasse tun:

data class B(private val _teachers: List<Teacher> = emptyList()) { 
    private class Teachers(private val list: List<Teacher>) : List<Teacher> by list { 
     override operator fun get(int: Int): Teacher { 
      var t = Teacher() 
      t.name = "asd" 
      return t ; 
     } 
    } 

    val teachers: List<Teacher> = Teachers(_teachers) 
} 

fun main(args: Array<String>) { 
    println(B().teachers[0].name) // Prints "asd" 
} 

Wenn ich überschreiben die get -function es jeden betreffen wird, die die B-Klasse verwendet, nicht nur, wo würden Sie Importieren Sie die Erweiterungsfunktion.

Beachten Sie, dass ich alle anderen Methodenaufrufe auf die Teachers-Klasse zu der zugrunde liegenden Liste delegieren.

+0

nicht überschatten, danke! Sie lassen mich viel wissen und beheben meine Frage. – junk

Verwandte Themen