2016-11-10 6 views
3

Ist es möglich, eine allgemeine zu implementieren, sagen wir mal, zusätzlich wie folgt aus:Kotlin, generische Zusatz

public abstract interface NumberEx { 

    abstract fun plus(other: NumberEx): NumberEx 
} 

abstract interface Vec2t<T : NumberEx> { 

    open var x: T 
    open var y: T 

    fun add(res: Vec2t<T>, a: Vec2t<T>, bX: T, bY: T): Vec2t<T> { 
     res.x = a.x + bX 
     res.y = a.y + bY 
     return res 
    } 
} 

Weil hier die Compiler beschwert sich über a.x + bX und a.y + bY:

Typenkonflikt. Erforderlich: T Gefunden: NumberEx

+1

Ich las "Kotlin, generische Sucht": < – mklimek

+0

Es ist ok, wir sind alle kotlin süchtig hier. In b4 Kotlin Anonym – elect

Antwort

6

Eine Möglichkeit, eine rekursive NumberEx Definition wie so beschäftigen wird:

interface NumberEx<T : NumberEx<T>> { 
    operator fun plus(other: T): T 
} 

Diese eine Implementierung erfordern würde ein Plus-Operator zur Verfügung zu stellen:

class ANumber : NumberEx<ANumber> { 
    override fun plus(other: ANumber): ANumber { 
     //TODO 
    } 
} 

Und würde es durch Compiler sicher und verständlich machen, in Vec2t

zu verwenden
+0

Danke, es funktioniert. Eine weitere Frage, gibt es eine Möglichkeit, die primitiven Typen ('Float',' Int', etc ..) zu bekommen, die 'NumberEx' erweitern? – elect