2016-11-10 6 views
1

私はKotlinとジェネリック医薬品、ジェネリック配列で実装する抽象ジェネリッククラス

abstract class Vec2t<T : Number>(open var x: T, open var y: T)

data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>(x, y)

によって実装以下の抽象クラスは、これまでのところ、すべてがうまく機能してい

今、行列についても同様のことをしたいと思っています。これは現時点では私のabstですRACTクラス

class Mat2(override var value: Array<Vec2>) : Mat2t<Float>(value)

しかし、コンパイラArray<Vec2>に文句を言いによって実装されなければならない

​​

Error:(8, 32) Kotlin: Type of 'value' doesn't match the type of the overridden var-property 'public open var value: Array> defined in main.mat.Mat2t'

私は言われた:

  • varプロパティのタイプを変更することはできません(実際には変更していないので、サブタイプでオーバーライドしています。同じことですか?)
  • mat2.value = object : Vec2t<Float>() { ... }任意のサブクラスに該当してはならないMat2t<Float>

どのようにこれらの問題を解決できますか?

抽象汎用クラスMat2tに汎用配列を持たせ、それをサブタイプ配列で実装する方法はありますか?あなたがあなたをvar valueをオーバーライドしているよう

abstract class Mat2t<T : Vec2t<*>>(open var value: List<T>) 

class Mat2(override var value: List<Vec2>) : Mat2t<Vec2>(value) 

なお:

答えて

3

代わりVec2tのジェネリックパラメータの型のサブタイプのVec2tのサブタイプ(T : Number)あなたの一般的なパラメータをすることによって、これを達成することができます抽象クラスのコンストラクタでそれを持つ必要はありません。同じことがVec2tに当てはまります。例えば:それはあなたに合っている場合

abstract class Vec2t<T : Number> { 
    abstract var x: T 
    abstract var y: T 
} 

class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>() 

abstract class Mat2t<T : Vec2t<*>> { 
    abstract var value: List<T> 
} 

class Mat2(override var value: List<Vec2>) : Mat2t<Vec2>() 

これらの抽象クラスは、その後も、代わりのインターフェースとして表すことができる:

interface Vec2t<T : Number> { 
    var x: T 
    var y: T 
} 

data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float> 

interface Mat2t<T : Vec2t<*>> { 
    var value: List<T> 
} 

data class Mat2(override var value: List<Vec2>) : Mat2t<Vec2> 
+0

それは動作しますが、素敵。私はあなたが 'Array'を介して' List'を使ったのを見ます。共分散を得るには?参考までに、私は[this](https://github.com/g-truc/glm/blob/master/glm/detail/type_mat2x2.hp​​p)のポートを開こうとしています。インターフェイスについてのヒントは、+1 – elect

+0

@elect私が推測する習慣。私は 'Array'を使うことはほとんどありません。また、 'Vec2'が'データクラス 'であることがわかります。これは、' Mat2'を 'データクラス 'にしたいと思うかもしれないと信じさせています。この場合、もしあなたが' equals'と 'hashCode'を'Array'を使用しています(実装していません)が、' List'を使用すると、コンパイラがそれを処理します。 http://stackoverflow.com/q/36262305/3255152も参照してください。 – mfulton26

+0

FYI:あなたが何をしているのかは分かりませんが、さまざまな線形代数/行列のJavaライブラリがあります:http://stackoverflow.com/questions/10815518/java-matrix-librariesたぶんそれらのうちの1つは、あなたのユースケースを既に満たしています。そうでないかもしれない。楽しい! – mfulton26

関連する問題