У меня есть следующий код 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].Есть ли способ обойти это?