如何指定开往Float和Double在斯卡拉泛型类型的类型?
-
27-09-2019 - |
题
我写一些简单的向量和矩阵类。他们是这样的:
// 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]
的想法是,阶编译器生成专门类的Vector3 [浮点]和的Vector3 [双]为C ++模板会做类似。不幸的是我不得不把一些类型的约束的类型参数的[T]类的Vector3这样+上T.我的问题定义操作:我如何写的Vector3 [浮点],它具有相同的性能特点Vector3f? 语境:我想用在碰撞检测代码Vector3f /的Vector3D类...所以表现为我做事情
解决方案
使用结合分数的上下文:
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
为师。
不隶属于 StackOverflow