2013-09-15 6 views
3

У меня есть квоаскикот, где q"someMethod[$ts]()" где def someMethod[I <: shapeless.HList]()".Каков тип квазиквазота, который соответствует параметрам типа сопоставления?

Печать ts дает:

List(shapeless.HNil) 

или, например

List(String, Int) 

Тогда я пытаюсь присвоить:

val types: List[scala.reflect.api.Types.Type] = ts 

, что приводит к ошибке компилятора:

[error] type mismatch; 
[error] found : List[_125.u.Tree] where val _125: scala.reflect.api.QuasiquoteCompat.TypeAppliedExtractor{val u: OpTreeContext.this.c.universe.type} 
[error] required: List[Context.this.c.universe.Type] 

Как составить List[scala.reflect.api.Types.Type] из ts?

ответ

3

Как указано в сообщении об ошибке, ts - это список деревьев. Более конкретно, это будет type trees, и вы можете извлечь их тип с tpe методом:

val types: List[scala.reflect.api.Types#Type] = ts.map(_.tpe) 

Обратите внимания, что я с помощью проекционного типа, так как Types ни пакет, ни объект, так Types.Type выиграл» т работы.

+0

Спасибо. Оно работает. '_.tpe' прав, что я искал. –