在Scala中反映超类的值类型参数,没有TypeTag

时间:2014-12-09 09:10:33

标签: scala generics reflection

在Java中,虽然在运行时擦除了类型参数,但是可以找到传递给超类的实际类型参数:

class Derived extends Base<String> {
  // ...
}

ParameterizedType type = (ParameterizedType)Derived.class.getGenericSuperclass();
Type[] args = type.getActualTypeArguments(); // gives {String.class}

虽然我可以对Scala类使用相同的Java反射,但它没有捕获Scala的值类型:

class Base[T]
class Derived extends Base[Int]

classOf[Derived]
  .getGenericSuperclass
  .asInstanceOf[ParameterizedType]
  .getActualTypeArguments // gives {Object.class}, not {int.class}

是否可以确定从通用超类扩展时使用的值类型?我从jar文件加载类,所以最好只使用java.lang.Class实例来实现。

1 个答案:

答案 0 :(得分:2)

在Java反射中,您无法获得Int和其他AnyVal类型,因为它们是由编译器专门处理的,如果它们被普遍使用,它们将由{ {1}}。但是,您可以使用Scala反射,完全可以从Java反射转换为Scala反射。以下是:

Object

不幸的是,除非您确切知道自己要搜索的内容,否则很难找到合适的文档。我在scala-users mailing list找到了答案。 Scala反射仍然是实验性的,AFAIK,它可能会在未来的Scala版本中被更好的替代。