Scala方法镜像返回类型始终为Any

时间:2014-04-22 21:40:55

标签: scala reflection

我是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),那么方法镜的意义是什么?

1 个答案:

答案 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