我有以下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)
}
,但我得到一个编译错误的第二个方法,因为实例。getClass返回一个Class[_]而不是Class[T]。有办法绕过这个吗?
下面的编译,是你想要的吗?
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)
}
}