在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
实例来实现。
答案 0 :(得分:2)
在Java反射中,您无法获得Int
和其他AnyVal
类型,因为它们是由编译器专门处理的,如果它们被普遍使用,它们将由{ {1}}。但是,您可以使用Scala反射,完全可以从Java反射转换为Scala反射。以下是:
Object
不幸的是,除非您确切知道自己要搜索的内容,否则很难找到合适的文档。我在scala-users mailing list找到了答案。 Scala反射仍然是实验性的,AFAIK,它可能会在未来的Scala版本中被更好的替代。