2013-04-09 4 views
4

Как я могу проверить, является ли WeakTypeTag или Type представляет собой бетонный тип? Это было бы особенно полезно в макросах, где я мог бы использовать его, чтобы поднять ошибку компиляции, когда тип, предоставленный пользователем, не конкретны:Как проверить, является ли WeakTypeTag или Type конкретным типом?

def macroMethod[T]: Unit = macro macroMethod_impl[T] 

def macroMethod_impl[T: c.WeakTypeTag](c: Context): c.Expr[Unit] = { 
    import c.universe._ 

    def isConcrete(tpe: Type) = ??? 

    if(!isConcrete(weakTypeOf[T])) { 
    c.error(c.enclosingPosition, "You must provide concrete type.") 
    } 

    c.literalUnit 
} 

ответ

1

Я думаю, что это будет делать трюк:

def isConcrete(tpe: Type) = !tpe.typeSymbol.asType.isAbstractType 

затем

scala> macroMethod[Int] 

scala> class C[T] { macroMethod[T] } 
<console>:10: error: You must provide concrete type. 
     class C[T] { macroMethod[T] } 
+1

Что относительно 'List [T]'? Что относительно 'List [T] forSome {type T}'? –

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