отражение и проверка типов в scala - PullRequest
0 голосов
/ 06 августа 2011

У меня есть следующий код 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 Ответ

1 голос
/ 06 августа 2011

Следующие компиляции, это то, что вы ищете?

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)
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...