Scala: использование TypeTag в методе

Я пытаюсь написать такой метод:

def foo[T:TypeTag](value: Int):String = {
  (/* do something */).mapTo[T].map(_.toJson)
}

где mapTo имеет подпись:

def mapTo[S](implicit tag: ClassTag[S]): Future[S] = { ... }

используя org.scala-lang.scala-reflect, чтобы сделать что-то вроде:

foo[String](1), foo[List[Double]](10) и так далее.

Пробовал писать по разному, но получались разные ошибки компиляции. Есть ли способ заставить что-то подобное работать?

Error:(26, 45) Cannot find JsonWriter or JsonFormat type class for T
    (/* do something */).mapTo[T].map(_.toJson)
                                            ^
Error:(26, 45) not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[T])spray.json.JsValue.
Unspecified value parameter writer.
    (/* do something */).mapTo[T].map(_.toJson)
                                        ^

Эта ссылка Как получить ClassTag из TypeTag или оба одновременно? не уточняет, что мне нужно. Похоже на попытку "отфильтровать" какую-то информацию о каком-то классе.


person Randomize    schedule 09.06.2016    source источник
comment
Возможный дубликат Как получить ClassTag из формы TypeTag, или оба одновременно?   -  person Kolmar    schedule 09.06.2016
comment
Я не могу получить ответ из того, что вы предложили.   -  person Randomize    schedule 09.06.2016


Ответы (2)


Прочитал ошибки: mapTo работает. Это toJson, которого нет и не должно: вы не можете преобразовать T с TypeTag в JSON. Просто потребуйте, чтобы T также имел JsonWriter: def foo[T: TypeTag: JsonWriter](value: Int) = .... Вы также получите Future[String], а не String.

person Alexey Romanov    schedule 10.06.2016
comment
Спасибо. Ваше предложение сработало! Это последняя необходимая подпись: foo[T:TypeTag:JsonWriter](value: Int)(implicit tag: ClassTag[T]): StandardRoute - person Randomize; 10.06.2016

Если вам нужен ClassTag, то почему бы не изменить метод foo, чтобы получить ClassTag? Вот так:

def foo[T](value: Int)(implicit ev: ClassTag[T]): String ={ ...

Казалось бы, это удовлетворит вашу основную потребность объявить, что существует ClassTag в неявной области видимости.

Изменить:

То, что вы показываете, не имеет ничего общего с ClassTag, а связано с тем фактом, что в нем отсутствуют имплициты для JsonWriter или JsonFormat. Вероятно, вам не хватает импорта, чтобы включить их в область действия.

person wheaties    schedule 09.06.2016
comment
Я уже пробовал, но что мне передать в bar[T]? Проблема компиляции в bar. - person Randomize; 09.06.2016
comment
@Randomize, значит, ты говоришь, что val yo = something.bar[T] не работает? - person wheaties; 09.06.2016