Подтвердить что ты не робот

Scala общий метод - для TTT недоступен для T

Я относительно не знаком с Scala и пытаюсь определить общий метод объекта. Однако, когда я ссылаюсь на параметризованный тип внутри метода, я получаю "No ClassTag для 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)
                                                                        ^

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

4b9b3361

Ответ 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

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