scala中的反射和类型检查

时间:2011-08-05 23:43:47

标签: generics scala reflection

我有以下scala代码

def invokeMethods(instance: AnyRef, clazz: Class[_]) {
   assert(clazz.isInstance(instance)   // <- is there a way to check this statically? 

   for {method <- clazz.getDeclaredMethods
        if shouldInvoke(method) // if the method has appropriate signature
       } method.invoke(instance)
}

// overload for common case
def invokeMethods(instance: AnyRef) {
   invokeMethods(instance, instance.getClass)
}

这很好用,但我想知道运行时断言是否可以用编译时类型检查替换。我天真的尝试是将第一种方法改为

def invokeMethods[T <:AnyRef](instance: T, clazz: Class[T]) {
   for {method <- clazz.getDeclaredMethods
        if shouldInvoke(method)
       } method.invoke(instance)
}

但是我在第二个方法上遇到编译错误,因为instance.getClass返回Class [_]而不是Class [T]。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

以下编译,是您要找的?

object Test {
   def shouldInvoke(m: java.lang.reflect.Method) = true
   def invokeMethods[T <:AnyRef](instance: T, clazz: Class[_ <: T]) {
     for {method <- clazz.getDeclaredMethods
       if shouldInvoke(method)
     } method.invoke(instance)
   }

   def invokeMethods[T <: AnyRef](instance: T) {
     invokeMethods(instance, instance.getClass)
   }
}