2014-04-22 58 views
1

我是斯卡拉新手。那么我怎么能解决方法镜像总是返回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 

我可以得到正确的函数,返回正确的对象,而不是任何?谢谢! 如果方法镜像不能返回适当的对象(如String),那么方法镜像的要点是什么?

+1

提高这是相同的行为Java反射API。方法实例在被调用时将始终返回Object的一个实例。我不认为你所寻求的行为存在。这些反射类类型没有使用泛型设置,以便在调用时返回正确的返回类型。 – cmbaxter

+0

@cmbaxter:这与泛型无关;这是一个基本的限制(尽管我甚至不愿将它称为限制) - 宇宙中没有办法让动态反映的实体具有静态类型。 –

回答

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