Kotlin,实例化问题和泛型
我有一个扩展了Vec3t的类Vec3iKotlin,实例化问题和泛型,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
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()