Sono molto nuovo di Scala.Scala: vincolo sul tipo di classe generico
Voglio implementare una classe matrice generica "classe Matrix [T]". L'unico vincolo su T dovrebbe essere che T dovrebbe implementare un "+" e una "*" forma/funzione. Come procedo a fare questo?
Ad esempio, desidero essere in grado di utilizzare sia Int, Double, sia i miei tipi definiti ad es. Complesso
Stavo pensando qualcosa del tipo:
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
}
Tutto Tipo controlli, ma non riesco ancora a un'istanza di una matrice. Mi manca un costruttore implicito? Come potrei fare per farlo? O mi sbaglio del mio metodo?
Grazie in anticipo Troels
ho considerato numerico. Ma non vedo davvero come funzionerebbe per i miei tipi, ad es. Complesso. Penserei che Complesso poi avrebbe bisogno di estendere Numeric. Quale prima di tutto richiederebbe l'implementazione di molti più metodi oltre a + e *. Tra questi ordini - Per quanto ne so non esiste un ordine rigoroso su numeri complessi. Il punto chiave è che ho bisogno di Matrix per lavorare su tutti i tipi che riempiono completamente i metodi + e *. –
Ci sono molti metodi da implementare se hai solo bisogno di + e *. Ma puoi ancora creare qualcosa come Numeric con solo questi due metodi. Questo dovrebbe essere molto lavoro. (E magari tornare più tardi e sostituirlo con Numeric se ne vale la pena.) –
@troels Puoi sempre ordinare per la parte reale, o semplicemente restituire "0" per tutti i confronti. E puoi sempre "implementare" i metodi con 'error (" metodo indefinito ")'. Si noti, tuttavia, che 'Complex' non sarebbe _extend_' Numerico'. Invece, ci sarebbe un'istanza di un 'Numerico [Complesso]'. –