C++/テンプレートの世界から scala に移行するのに苦労しています。T をインスタンス化するために使用するものがそれらの操作をサポートしている限り、必要なテンプレート パラメーター T に対して任意の操作を使用できることに慣れています (基本的にコンパイル時のダック タイピング)。単一の型パラメーターを持つ抽象クラスを定義できるようにし、型 T の特定のインターフェイスを期待する対応するイディオムを Scala で見つけることができません。
私が持っているものはほとんど機能しますが、T が Int からの変換/構築をサポートしていることを抽象クラス (Texture[T <: Summable[T]]) に伝える方法がわかりません。T が変換をサポートしていることを Texture が認識できるように、トレイト Summable に暗黙的な変換を追加するにはどうすればよいですか?
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)
}