2013-09-10 1 views
17

У меня есть некоторый код, как это:Как получить форму ClassTag TypeTag или оба одновременно?

class ReflectiveJsonFormat[T:TypeTag] extends JsonFormat[T] { 
    def write(x: T) : JsValue = { 
    val t = typeOf[T] 
    val getters = t.declarations.filter { s => s.isMethod && s.asMethod.isGetter } 
    val mirror = runtimeMirror(this.getClass.getClassLoader) 
    val instanceMiror = mirror.reflect(x) 
    } 
} 

Последняя строка завершается с:

Нет ClassTag доступные для T

Я думал TypeTag было больше информации, чем ClassTag? Могу ли я получить ClassTag от TypeTag? Если нет, есть ли какой-то синтаксис, говорящий, что T имеет две границы контекста - и TypeTag, и ClassTag? Или, как бы вы могли исправить этот код?

ответ

16

Ну Scala поддерживает несколько контекстных границы, если это то, что вы после:

class ReflectiveJsonFormat[T:TypeTag:ClassTag] 
+0

Я определенно предпочитаю ответ @ gourlaysama на этот. Спрашивать обоим является излишним, так как 'TypeTag' является фактически надмножеством класса ClassTag по крайней мере так, как я думаю об этом. Как поясняет ответ @ gourlaysama, ClassTag действительно является оберткой вокруг 'java.lang.Class', а из TypeTag вы можете получить соответствующий экземпляр класса. – tksfz

+1

Для чего я полностью согласен, но OP сказал «или оба в одно и то же время», чего на самом деле легче достичь (избыточность notwistanding), как показывает мой ответ. –

20

библиотека не обеспечивает встроенный метод, который непосредственно преобразует TypeTag к ClassTag, но вы можете написать один:

import reflect.runtime.universe._ 
import reflect.ClassTag 

def typeToClassTag[T: TypeTag]: ClassTag[T] = { 
    ClassTag[T](typeTag[T].mirror.runtimeClass(typeTag[T].tpe)) 
} 

Тогда в вашем методе просто добавьте перед неявной ClassTag необходимо:

implicit val c = typeToClassTag[T] 
+0

Спасибо, вы оба ответили на мой вопрос из двух частей. Я принял другой, потому что в этом случае это то, что я использовал. –

+0

Превосходно, сортировал меня прямо – sacha

 Смежные вопросы

  • Нет связанных вопросов^_^