J'écris quelques classes simples Vector et Matrix. Ils ressemblent à ceci:Comment spécifier un type lié pour Float et Double sur un type générique dans Scala?
// 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)
}
Si je vais avec des méthodes et des autres classes comme Point3f/j, Vector4f/j, Matrix3f/j, Matrix4f/d ... cela va être beaucoup de travail. Uff ... Donc, je pensais que les génériques pourraient aider ici et supprimer la redondance de mon code de base. Je pensais à quelque chose comme ceci:
// 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]
L'idée est que le compilateur génère des classes spécialisées scala pour Vector3 [Float] et Vector3 [Double] similaire en C++ modèle ferait. Malheureusement je dois mettre un type lié sur le paramètre de type [T] de la classe Vector3 tel que l'opérateur + est défini sur T. Ma question: Comment puis-je écrire Vector3 [Float] qu'il a les mêmes caractéristiques de performance que Vector3f? Contexte: Je voudrais utiliser les classes Vector3f/Vector3d dans le code de détection de collision ... donc la performance est importante pour moi.
Vous pouvez vérifier http://scala-programming-language.1934581.n4.nabble.com/Who-wants-to-take-Numeric-T-seriously-over-a-1-3-year- timescale-td2009520.html pour quelques idées. – mkneissl
Merci pour ce lien! Ce fut une lecture très utile pour moi. – gruenewa