2016-10-13 7 views
0

나는코 틀린, 인스턴스화 문제 및 일반은

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 이전에 인용 한 2 차 생성자를 유효하지 않습니까?

+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

범인은'out' 키워드였습니다. 나는' 문서에서 "in"및 "out"을 선택하면 기본 용어로 신속하게 설명해 주시겠습니까? – elect

+0

복잡합니다. "빨리"적용되지 않습니다. http://kotlinlang.org/docs/reference/generics.html ... 토론이나 SO 스타일 질문이 아니기 때문에 포럼, 여유 시간 등에서이 질문을하는 것이 가장 좋습니다. –