2016-11-10 82 views
3

是否有可能實現一個通用的,比方說,除了類似如下:科特林,通用除了

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 
    } 
} 

因爲這裏的編譯器抱怨a.x + bXa.y + bY

類型不匹配。要求:t上找不到:NumberEx

+1

我看到「Kotlin,通用成癮」:< – mklimek

+0

沒關係,我們都是kotlin在這裏上癮。在b4 Kotlin匿名 – elect

回答

6

一種方法是採用遞歸NumberEx定義,像這樣:

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

這將需要實施提供一個加號:

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

而且會使編譯器的類型安全並易於理解,可用於Vec2t

interface Vec2t<T : NumberEx<T>> { 
    ... 
} 
+0

謝謝,它的作品。還有一個問題,有沒有辦法獲得擴展'NumberEx'的原始類型('Float','Int'等等)? – elect