按类名

时间:2016-06-18 21:19:22

标签: scala generics scala-macros variance scala-reflect

我正在处理宏注释,我有类似的东西:

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

问题是当className类似于List时,它显然会抱怨,因为它需要参数。如果是List[String],则没关系。

说实话,我不完全理解为什么,例如,考虑到List中的泛型类型是不变的,classOf[List]不被接受?执行classOf[List[String]]classOf[List[Integer]]会返回相同的类。

因此,假设我的方法findClass将始终收到没有参数或不变参数的类,我该怎样检查ValDef

1 个答案:

答案 0 :(得分:0)

  

为什么,例如,考虑到List中的泛型类型是不变的,不接受classOf [List]

因为写这个的正确方法是classOf[List[_]],以便与其他用法保持一致。参数的方差并不重要(尽管List是协变的,而不是不变的。)

这很难看,而且我可能没有想到更好的解决方案,但您可以尝试使用s"??? : ${className}"进行类型检查,然后s"??? : ${className}[_]"等等。