2016-06-18 3 views
1

Я работаю на макро аннотацию, и у меня есть что-то вроде этого:Найти параметры класса имя класса

def findClass(className: String) : ClassSymbol = { 
    val tree = c.typecheck(c.parse(s"??? : ${className}")); 
    return tree.tpe.typeSymbol.asClass; 
} 

Вопрос заключается в том, что, когда className что-то вроде List, он явно жалуется потому, что он ожидает параметров. Если это List[String], тогда это нормально.

Если честно, я не совсем понимаю, почему, например, classOf[List] не принимается, учитывая, что общий тип в Списке инвариантен? Выполнение classOf[List[String]] и classOf[List[Integer]], возвращает тот же класс.

Итак, предполагая, что мой метод findClass всегда будет получать класс без параметров или с параметрами инварианта, как я могу проверить тип ValDef?

ответ

0

почему, например, classOf [Список] не принято, учитывая, что общий тип в списке инвариантно

Поскольку правильный способ написать это classOf[List[_]], для совместимости с другими использований. Дисперсия параметров не имеет значения (хотя List является ковариантным, а не инвариантным).

Это некрасиво, и, вероятно, лучшие решения я уверен, не думать, но вы можете попробовать, s"??? : ${className}" проверке типов затем s"??? : ${className}[_]" и т.д.

+0

да, в тот момент, который, как я это сделал, но попытка и ошибка очень уродливые. Должно быть лучшее решение, возможно, с экстракторами или функциями лямбда-типа. Но, возможно, и думать об этом. – lqbweb

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