2016-10-13 8 views
0

私は従うKotlin、インスタンス化の問題と一般的な

constructor(v: Vec3t<Number>) : this(v.x.toInt(), v.y.toInt(), v.z.toInt()) 

と常にVec3t

を拡張する他のクラスVec3ubとして一つの第二コンストラクタとして持ってVec3t

data class Vec3i(
    override var x: Int = 0, 
    override var y: Int = 0, 
    override var z: Int = 0 
) : Vec3t(x, y, z) 

を拡張するクラスVec3iを持っています

data class Vec3ub(
    override var x: Ubyte = Ubyte(0), 
    override var y: Ubyte = Ubyte(0), 
    override var z: Ubyte = Ubyte(0) 
) : Vec3t(x, y, z) 

ここで、Vec3tは順番に

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

そしてUBYTEは私がVec3ub

Vec3i(vec3ub) 

からVec3iをインスタンス化したいのですが、コンパイラはそのためのコンストラクタがないと文句を言い数

を拡張..

理由をISN私は以前に引用した二次コンストラクタを有効にしませんか?

+0

これを有効な質問にするには、型パラメータを含める必要があります。例えば、 'Vec3t'は' T'型のパラメータがありません。また、 'constructor(v:Vec3t)'はこのパラメータを持つ必要があります。必要な型パラメータでコードを修正すると、コードが正しくコンパイルされます。 – nhaarman

+0

申し訳ありませんが、彼らは私の頭の上にそれらを書いたときに失われた、私はそれらのコードで持っているが、私はまだエラーを得る – elect

答えて

2

は完全を期すために、私のコメントで述べたように、次のように正しくコンパイル:

data class Vec3i(
     override var x: Int = 0, 
     override var y: Int = 0, 
     override var z: Int = 0 
) : Vec3t<Int>(x, y, z) { 

    constructor(v: Vec3t<out Number>) : this(v.x.toInt(), v.y.toInt(), v.z.toInt()) 
} 

data class Vec3ub(
     override var x: Ubyte, 
     override var y: Ubyte, 
     override var z: Ubyte 
) : Vec3t<Ubyte>(x, y, z) 

abstract class Vec3t<T>(
     override var x: T, 
     override var y: T, 
     open var z: T 
) : Vec2t<T>(x, y) 

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

fun test(vec3ub: Vec3ub) { 
    val vec3i = Vec3i(vec3ub) 
} 

abstract class Ubyte : Number() 

constructor(v : Vec3t<out Number>) : ...、他のすべての追加の一般的なパラメータ型。 Numberを渡さないので、ここではVec3t<Number>の代わりにVec3t<out Number>が必要ですが、そのサブクラスになります。

+0

犯人は、 'アウト'キーワードだった..私は '文書から「in」と「out」を選択すると、基本的にそれをすばやく明らかにすることはできますか? – elect

+0

複雑ですが、「すぐに」は適用されません。 http://kotlinlang.org/docs/reference/generics.html ...これはディスカッションであり、SOスタイルの質問ではないので、フォーラム、スラックなどでこれを尋ねるのが最適です。 –

関連する問題