2014-09-05 5 views
1

У меня есть макрос Def Scala (2.10) с аргументом x. Это тело выглядит следующим образом:Соответствие родовых типов в макросах Scala

if (x.actualType =:= typeOf[generic.Type[String]]) { 
    // branch 1: do something with x 
} 
else { 
    // branch 2: do something else 
} 

Реализация generic.Type самого класса не доступна, и его реализация не может быть изменена. Теперь я хочу, чтобы этот макрос вызывал ветвь 1 не только для generic.Type [String] s, но для generic.Type [T], где T - любой тип.

Есть ли канонический способ достижения этого? Или это единственный способ сделать это вручную с помощью AST?

+0

Что такое подпись макроса? – Ashalynd

+0

Это def def (c: Контекст) (x: c.Expr [Any]): c.Expr [Any] – fishlips

ответ

2

Пробег: x.actualType.typeSymbol == typeOf[generic.Type[_]].typeSymbol

+0

Типы представляют типы Scala, такие как 'Foo [Bar]' или даже что-то действительно сложное, как 'Foo forSome { type Bar <: Baz}. Символы представляют определения Scala (каждое определение имеет один и только один символ, связанный с ним). Следовательно, правильный способ проверки того, относится ли что-то (например, компонент типа) к определенному определению, заключается в сравнении символов. –

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