Scala generic method - нет доступного класса для T


Я относительно новичок в Scala и пытаюсь определить общий метод объекта. Однако, когда я ссылаюсь на параметризованный тип в методе, я получаю "No Classstag available for T". Вот надуманный пример, который иллюстрирует проблему.

scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
<console>:7: error: No ClassTag available for T
       def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
                                                                        ^

заранее спасибо за помощь в понимании того, что здесь неправильно и как заставить этот пример работать.

1   51   2013-06-04 19:00:54

1 ответ:

для создания экземпляра массива в общем контексте (создание экземпляра массива T здесь T является параметром типа), Scala должна иметь информацию во время выполнения о T, в виде неявного значения типа ClassTag[T]. Конкретно, вам нужно, чтобы вызывающий ваш метод (неявно) передал это ClassTag значение, которое можно удобно сделать с помощью контекстно-привязанных:

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)

для (полного) описания этой ситуации см. Это документ:

http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

(короче говоря, Classstags-это переработанная реализация ClassManifests, поэтому обоснование остается)