Scala: как создать универсальный тип, который является подтипом всех числовых классов в Scala, чтобы он мог включать метод сравнения - PullRequest
6 голосов
/ 31 августа 2009

Я пытаюсь создать универсальный класс с универсальным типом, являющимся подклассом числового (чтобы убедиться, что я имею дело с числами) и я попытался "class NuVector[T<:Numeric[T])" в качестве класса def, и он прекрасно компилируется.

Теперь я хочу добавить к нему PartiallyOrdered[T]. поэтому я сделал следующее:

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

}

не компилируется. Я получаю ошибку при компиляции:

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

Версия Scala, которую я использую: 2.8

Любая помощь очень ценится.

Спасибо
~ Tiger.
Я не знаю, это ошибка или проблема с моим определением.

Ответы [ 2 ]

7 голосов
/ 31 августа 2009

Scala's Numeric[T] использует "Типовой образец" . Не имеет смысла говорить class NuVector[T <: Numeric[T]]. Вместо этого вы хотите class NuVector[T](implicit n: Numeric[T]).

5 голосов
/ 07 августа 2010

еще лучше, используйте class NuVector[T:Numeric]

Это также называется контекстным ограничением и является просто синтаксическим сахаром для class NuVector[T](implicit n: Numeric[T])

где n на самом деле - это какое-то синтетическое имя, к которому у вас нет прямого доступа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...