Je suis très nouveau à Scala.Scala: Contrainte sur le type de classe générique
Je souhaite implémenter une classe de matrice générique "class Matrix [T]". La seule contrainte sur T devrait être que T devrait implémenter un "+" et un "*" mothod/fonction. Comment vais-je faire cela?
Par exemple, je veux pouvoir utiliser à la fois Int, Double et mes propres types définis, par ex. Complexe
Je pensais quelque chose le long des lignes:
class Matrix[T <: MatrixElement[T]](data: Array[Array[T]]) {
def *(that: Matrix) = ..// code that uses "+" and "*" on the elements
}
abstract class MatrixElement[T] {
def +(that: T): T
def *(that: T): T
}
implicit object DoubleMatrixElement extends MatrixElement[Double]{
def +(that: Double): Double = this + that
def *(that: Double): Double = this * that
}
implicit object ComplexMatrixElement extends MatrixElement[Complex]{
def +(that: Complex): Complex = this + that
def *(that: Complex): Complex = this * that
}
Tout contrôles de type, mais je ne peux toujours pas instancier une matrice. Est-ce que je manque un constructeur implicite? Comment ferais-je cela? Ou ai-je complètement tort de ma méthode?
Merci à l'avance Troels
I considéré numérique. Mais je ne vois pas vraiment comment cela fonctionnerait pour mes propres types, par ex. Complexe. Je pense que Complex devrait alors étendre Numeric. Ce qui d'abord exigerait que j'implémente beaucoup plus de méthodes que juste + et *. Parmi ces commandes - Autant que je sache, il n'y a pas d'ordre strict sur les nombres complexes. Le point clé est que j'ai besoin de Matrix pour travailler sur tous les types qui remplissent uniquement les méthodes + et * sont implémentées. –
Il y a beaucoup de méthodes à implémenter si vous avez seulement besoin de + et *. Mais vous pouvez toujours créer quelque chose comme Numeric avec ces deux méthodes. Cela devrait être deux beaucoup de travail. (Et peut-être revenir plus tard et le remplacer par Numeric si cela vaut la peine.) –
@troels Vous pouvez toujours commander par la partie réelle, ou tout simplement retourner "0" pour toutes les comparaisons. Et vous pouvez toujours "implémenter" les méthodes avec 'error (" Undefined method ")'. Notez, cependant, que 'Complex' ne serait pas _extend_' Numeric'. Au lieu de cela, il y aurait une instance de 'Numeric [Complexe]'. –