Kotlin,实例化问题和通用

时间:2016-10-13 09:06:44

标签: kotlin

我有一个扩展Vec3t的类Vec3i

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

具有如下的一个辅助构造函数

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

另一个类Vec3ub,它总是延伸Vec3t

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

Vec3i(vec3ub)

但编译器抱怨说没有构造函数..

为什么我之前引用的辅助构造函数无效?

1 个答案:

答案 0 :(得分: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>) : ...和所有其他添加的通用参数类型。 Vec3t<out Number>是必要的,而不仅仅是Vec3t<Number>,因为您没有传递Number,而是传递它的子类。