我是Scala的新手。那么我怎么能解决方法镜总是返回Any的问题呢?
class ABC{
def getString(): String = {
return "a,b,c";
}
}
//somewhere in the project
val ru = scala.reflect.runtime.universe
val mirror = ru.runtimeMirror(getClass.getClassLoader);
val c = Class.forName("ABC");
val classSymbol = mirror.classSymbol(c);
val classType = classSymbol.toType;
val im = mirror.reflect(c.newInstance())
val _method_ = classType.declaration(ru.newTermName("getString")).asMethod;
val method = im.reflectMethod(_method_);
println(method()); //this prints "a,b,c"
println(method().length()); // error, value length is not a member of any
我可以获得正确的函数而不是Any吗?谢谢! 如果方法镜像无法返回正确的对象(如String),那么方法镜的意义是什么?
答案 0 :(得分:0)
运行时反射无法返回具有适当静态类型的对象,因为静态类型仅适用于编译时(因此静态类型);为了强制动态创建的对象具有所需的静态类型,您必须手动转换为您需要的任何类型,并且知道将在运行时返回。
所以:
val ret = method().asInstanceOf[String].length
或
val typedMethod = () => method().asInstanceOf[String]
val ret = typedMethod().length // ret will be 5
不幸的是,似乎没有办法直接将method
对象转换为适当的函数类型(除非我在这里遗漏了一些东西):
method.asInstanceOf[() => String]
将在运行时提升
java.lang.ClassCastException: scala.reflect.runtime.JavaMirrors$JavaMirror$JavaVanillaMethodMirror cannot be cast to scala.Function0
和
(method.apply _).asInstanceOf[() => String]
将在运行时提升
java.lang.ClassCastException: test$$anonfun$1 cannot be cast to scala.Function0