我正在寫一些簡單的矢量和矩陣類。他們是這樣的:如何爲Scala中的泛型類型指定一個類型爲Float和Double的綁定?
// Vector with Floats
case class Vector3f(x: Float, y: Float, z: Float) {
def +(v: Vector3f) = Vector3f(x + v.x, y + v.y, z + v.z)
}
// Vector with Doubles
case class Vector3d(x: Double, y: Double, z: Double) {
def +(v: Vector3d) = Vector3d(x + v.x, y + v.y, z + v.z)
}
如果我去與其他方法和類,如Point3f/d,Vector4f/d,Matrix3f/d,Matrix4f/d ...這將是大量的工作。 Uff ... 所以我認爲泛型可以在這裏得到幫助,並從我的代碼庫中刪除冗餘。我認爲是這樣的:
// first I define a generic Vector class
case class Vector3[@specialized(Float, Double) T](x: T, y: T, z: T) {
def +(v: Vector3[T]) = new Vector3[T](x + v.x, y + v.y, z + v.z)
}
// than I use some type aliases to hide the generic nature
type Vector3f = Vector3[Float]
type Vector3d = Vector3[Double]
的想法是,Scala編譯器生成專業類的Vector3 [浮點]和的Vector3 [雙]作爲一個C++類似模板會做。不幸的是,我必須在類Vector3的類型參數[T]上添加一些類型,以便在T上定義運算符+。我的問題:如何編寫Vector3 [Float]以使其具有與Vector3f相同的性能特徵? 上下文:我想在碰撞檢測代碼中使用Vector3f/Vector3d類...所以性能對我很重要。
你可能想檢查http://scala-programming-language.1934581.n4.nabble.com/Who-wants-to-take-Numeric-T-seriously-over-a-1-3-year- timescale-td2009520.html的一些想法。 – mkneissl 2010-08-11 22:28:24
感謝您的鏈接!這對我來說非常有幫助。 – gruenewa 2010-08-12 09:23:48