2009-08-31 5 views
6

Próbuję utworzyć klasę ogólną z typem ogólnym będącą podklasą Numeric (w celu zapewnienia, że ​​mam do czynienia z numerami.) i próbowałem "class NuVector[T<:Numeric[T])" jako klasy def i kompilacja była w porządku.scala: jak utworzyć typ ogólny, który jest podtypem wszystkich klas liczbowych w scala, tak aby mógł zawierać metodę porównania

Teraz chcę dodać do niego PartiallyOrdered[T]. więc zrobiłem:

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]] 
    } 

} 

to nie jest kompilacja. Błąd Dostaję podczas kompilacji jest:

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

wersja Scala używam 2.8

Każda pomoc jest mile widziana.

Dzięki,
~ Tiger.
Nie wiem, czy to błąd, czy też problem z moją definicją.

+0

Jakiej dokładnej wersji Scala2.8 używasz? Czy jest to związane z biletem 2274? (http://lampsvn.epfl.ch/trac/scala/ticket/2274) – VonC

Odpowiedz

7

Scala's Numeric[T] używa "Typeclass Pattern". Naprawdę nie ma sensu mówić: class NuVector[T <: Numeric[T]]. To, czego chcesz, to: class NuVector[T](implicit n: Numeric[T]).

+3

A skrót do tego to "kontekst związany" wprowadzony w Scali 2.8: 'class NuVector [T: Numeric]'. Tam gdzie 'T' jest w zasięgu, parametr dowodowy może być uzyskany za pomocą' val num = niejawnie [Numeric [T]] '. –

5

nawet lepiej użyć class NuVector[T:Numeric]

ten jest również znany jako kontekst związany, i jest po prostu cukier syntaktyczny dla class NuVector[T](implicit n: Numeric[T])

gdzie n jest rzeczywiście niektóre syntetycznie wytwarzanych nazwisko, że nie można przejść bezpośrednio