Kotlin,实例化问题和泛型

Kotlin,实例化问题和泛型,kotlin,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()) Vec3t依次在哪里 ab

我有一个扩展了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())
Vec3t依次在哪里

abstract class Vec3t<T : Number>(
  override var x: T, 
  override var y: T, 
  open var z: T
) : Vec2t(x, y)
但编译器抱怨说,没有用于此的构造函数


为什么我前面引用的二级构造函数无效?

为完整起见,如我在评论中所述,以下编译正确:

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() 
数据类Vec3i(
重写变量x:Int=0,
重写变量y:Int=0,
覆盖变量z:Int=0
):Vec3t(x,y,z){
构造函数(v:Vec3t):这个(v.x.toInt(),v.y.toInt(),v.z.toInt())
}
数据类Vec3ub(
重写变量x:Ubyte,
重写变量y:Ubyte,
覆盖变量z:Ubyte
):Vec3t(x,y,z)
抽象类Vec3t(
覆盖变量x:T,
覆盖变量y:T,
开放变量z:T
):Vec2t(x,y)
开放类Vec2t(
开放变量x:T,
开放变量y:T
)
趣味测试(vec3ub:vec3ub){
val vec3i=vec3i(vec3ub)
}
抽象类Ubyte:Number()

注意
构造函数(v:Vec3t):…
和所有其他添加的通用参数类型
Vec3t
在这里是必需的,而不仅仅是
Vec3t
,因为您传递的不是
数字,而是它的子类。

为了完整性,如我在评论中所述,下面的编译是正确的:

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() 
数据类Vec3i(
重写变量x:Int=0,
重写变量y:Int=0,
覆盖变量z:Int=0
):Vec3t(x,y,z){
构造函数(v:Vec3t):这个(v.x.toInt(),v.y.toInt(),v.z.toInt())
}
数据类Vec3ub(
重写变量x:Ubyte,
重写变量y:Ubyte,
覆盖变量z:Ubyte
):Vec3t(x,y,z)
抽象类Vec3t(
覆盖变量x:T,
覆盖变量y:T,
开放变量z:T
):Vec2t(x,y)
开放类Vec2t(
开放变量x:T,
开放变量y:T
)
趣味测试(vec3ub:vec3ub){
val vec3i=vec3i(vec3ub)
}
抽象类Ubyte:Number()

注意
构造函数(v:Vec3t):…
和所有其他添加的通用参数类型
Vec3t
在这里是必需的,而不仅仅是
Vec3t
,因为您传递的不是
数字,而是它的子类。

您应该包含类型参数,使其成为有效问题。例如,
Vec3t
缺少
T
类型参数。另外,
构造函数(v:Vec3t)
需要有这个参数。如果我用所需的类型参数更正代码,代码将正确编译。对不起,当我在头上写它们时,它们丢失了,我在代码中有它们,但我仍然得到错误您应该包括类型参数,以使这成为一个有效的问题。例如,
Vec3t
缺少
T
类型参数。另外,
构造函数(v:Vec3t)
需要有这个参数。如果我用所需的类型参数更正代码,代码就会正确编译。对不起,当我在头上写它们时,它们丢失了,我在代码中有它们,但我仍然得到了错误。罪魁祸首是
out
关键字。。我没有从文件中很好地了解到
输入
输出
之间的区别,请你迅速用基本术语澄清一下好吗?这很复杂,“快速”不适用。。。最好在论坛、slack等场合问这个问题,因为这是一个讨论问题,不是一个很有风格的问题。罪魁祸首是
out
关键字。。我没有从文件中很好地了解到
输入
输出
之间的区别,请你迅速用基本术语澄清一下好吗?这很复杂,“快速”不适用。。。最好在论坛、slack等场合问这个问题,因为这是一个讨论,而不是一个很有风格的问题。
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()