2016-11-10 4 views
3

はそれがジェネリックを実装することは可能ですが、のは、次のように追加しましょう:Kotlin、ジェネリック加え

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、generic addiction"を読んでいます:< – mklimek

+0

これは大丈夫です、私たちはすべてここでは中毒です。 In b4 Kotlin Anonymous – 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

ありがとう、それは動作します。もう1つの質問ですが、 'NumberEx'を拡張するプリミティブ型(' Float'、 'Int'など)を得る方法はありますか? – elect

関連する問題