2010-08-11 68 views
1

我正在寫一些簡單的矢量和矩陣類。他們是這樣的:如何爲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類...所以性能對我很重要。

+0

你可能想檢查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

+0

感謝您的鏈接!這對我來說非常有幫助。 – gruenewa 2010-08-12 09:23:48

回答

4

使用綁定分數的情況下:

case class Vector3[@specialized(Float, Double) T : Fractional](x: T, y: T, z: T) { ... 

則類的體內,得到算術運算符的實例:

val fractOps = implicitly[Fractional[T]] 

其成員最後導入的範圍等級:

import fractOps._ 

此後,您可以在值上寫入普通的中綴操作在課堂上使用的T型。可悲的是,你將不得不使用fractOps.div(a, b)而不是a/b進行劃分。

+0

感謝您的解決方案,但似乎有性能損失。向量添加 public Vector3f $ plus(Vector3f v){return new Vector3f(x()+ v.x(),y()+ v.y(),z()+ v.z()); }返回新的Vector3(fractOps()。plus(x(),vx()),fractOps()。plus(y(),vy()),fractOps(012) ().plus(z(),vz()),this.Vector3 $$ evidence $ 1); } 我想我不應該使用泛型來實現向量和矩陣類。 – gruenewa 2010-08-12 07:53:48

+0

@gruenewa:您需要查看字節碼並瞭解當前的本機代碼JVM(例如HotSpot)可以執行哪些操作。我認爲這很可能是所有在運行的應用程序中的內聯本地代碼。但是,如果沒有專門化,會出現對原始Float和Double的裝箱,這可能足以阻止JIT編譯器完全優化代碼。 – 2010-08-12 13:51:03

+0

@gruenewa你是否嘗試過衡量是否存在明顯的性能差異?這是確切知道的唯一方法 - 可能是'scalac'和/或JIT正在優化事物,以便沒有任何顯着差異。 – Jesper 2010-08-13 07:25:21

相關問題