C++/Templates의 세계에서 scala로 전환하는 데 어려움을 겪고 있습니다. 템플릿 매개 변수 T에서 원하는 작업을 사용할 수있는 데 익숙합니다. T를 인스턴스화하는 데 사용하는 모든 작업 (기본적으로 컴파일 타임에 Duck typing)을 지원하는 한 사용할 수 있습니다. 스칼라에서 단일 유형 매개 변수로 추상 클래스를 정의 할 수 있고 T 유형의 특정 인터페이스를 예상하는 해당 관용구를 찾을 수 없습니다.스칼라에서 형식 매개 변수 T가 Int (또는 Float, 또는 ...)에서 암시 적 변환을 지원한다는 추상 기본 클래스를 어떻게 말할 수 있습니까?
거의 작동하지만 어떻게 작동하는지 알 수 없습니다. T가 Int에서 변환/생성을 지원한다는 추상 클래스 (Texture [T < : Summable [T]])를 말하십시오. 내재적 변환을 Summit 특성에 추가하여 T가 변환을 지원한다는 것을 Texture가 알 수 있도록하려면 어떻게해야합니까?
trait Summable[T] {
def += (v : T) : Unit
def -= (v : T) : Unit
}
object Int4 { implicit def int2Int4(i : Int) = new Int4(i, i, i, i) }
class Int4 (var x : Int, var y : Int, var z : Int, var w : Int) extends Summable[Int4] {
def this (v : Int) = this(v, v, v, v)
def += (v : Int4) : Unit = { x += v.x; y += v.y; z += v.z; w += v.w }
def -= (v : Int4) : Unit = { x -= v.x; y -= v.y; z -= v.z; w -= v.w }
}
abstract class Texture[Texel <: Summable[Texel]] {
var counter : Texel
def accumulate(v : Texel) : Unit = { counter += v }
def decrement() : Unit = { counter -= 1 } //< COMPILE ERROR HERE, fails to find implicit
}
class Int4Target extends Texture[Int4] {
var counter : Int4 = new Int4(0, 1, 2, 3)
}
본인은 형질에 대한 암시에 대한 귀하의 이의 제기를 따르지 않습니다. 형질에 대한 함축성은 형질을 지탱하지 못하기 때문에 가능하지 않다. 클래스는 여기에 요청 된 것과 같은 것을 포함하여 종종 함축을 가질 수 있고, 그렇게 할 수 있습니다 - 클래스는 왜 그것을 가지지 만 특성 (생성자가 부족한 것 외에는)을 가질 수 없습니까? –
@ 대니얼 정확히. 클래스에는 생성자가 있으므로 암시 적 매개 변수가되므로 멤버가됩니다. 특성으로 모든 구성원이 명시 적으로 선언됩니다. 근본적으로 요점은 구성원이 없으면 암시 적 값을 전달할 수 없으므로 [T <% S]와 같이 서명에 나타날 수 없다는 것입니다. 그리고 암시 적 매개 변수가있는 클래스조차도 클래스의 인스턴스를 사용하는 사람들은 자동으로 범위에 포함되지 않습니다. – Owen