我有一个扩展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)
但编译器抱怨说没有构造函数..
为什么我之前引用的辅助构造函数无效?
答案 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
,而是传递它的子类。