2009-08-31 4 views
6

Sto provando a creare una classe generica con tipo generico che è sottoclasse di Numeric (per garantire che io stia trattando con i numeri.) e ho provato "class NuVector[T<:Numeric[T])" come class def e compila bene.scala: come creare un tipo generico che è sottotipo di tutte le classi numeriche in scala in modo che possa includere il metodo di confronto

Ora voglio aggiungere PartiallyOrdered[T] ad esso. così ho fatto quanto segue:

class NuVector[T<:Numeric[T]) extends PartiallyOrdered[T] 
{ 

/** Array that stores the vector values. 
    */ 
    val v = new Array [T] (_length) 
    /** Range for the storage array. 
    */ 
    private val range = 0 to _length - 1 

    def compare(x:T,y:T)(implicit res:Numeric[T]) :Int= 
    { 
     res.compare(x,y) 
    } 

    def tryCompareTo [B >: NuVector [T]] (b: B) 
     (implicit view$1: (B) => PartiallyOrdered [B]): Option [Int] = 
    { 
     compare(x,y) 
    } 

    implicit def castT2Ordering(x:T):Numeric[T]=x.asInstanceOf[Numeric[T]] 
    implicit def castB2NuVector [B>:NuVector[T]] (b:B): NuVector[T]= 
    { 
       b.asInstanceOf[NuVector[T]] 
    } 

} 

non si sta compilando. L'errore che sto ottenendo durante la compilazione è:

could not find implicit value for parameter res:Numeric[T] 

versione Scala che sto usando è 2,8

Qualsiasi aiuto è molto apprezzato.

Grazie,
~ Tigre.
Non so se si tratta di un bug o è un problema con la mia definizione.

+0

Quale versione esatta di Scala2.8 stai usando? E questo è legato al biglietto 2274? (http://lampsvn.epfl.ch/trac/scala/ticket/2274) – VonC

risposta

7

Scala Numeric[T] utilizza il "Typeclass Pattern". Non ha senso dire class NuVector[T <: Numeric[T]]. Quello che vuoi, invece, è class NuVector[T](implicit n: Numeric[T]).

+3

E la scorciatoia per questo è il "context bound" introdotto in Scala 2.8: 'class NuVector [T: Numeric]'. Laddove questo 'T' è in ambito, il parametro evidence può essere acquisito usando' val num = implicitamente [Numeric [T]] '. –

5

ancora meglio, utilizzare class NuVector[T:Numeric]

Questo è anche conosciuto come un contesto legato, ed è solo zucchero sintattico per class NuVector[T](implicit n: Numeric[T])

dove n è in realtà un nome sinteticamente generati che non è possibile accedere direttamente