2016-01-23 7 views
0

Я играю с отражением Scala и ScalaTest. Я метод, определенный следующим образом в объекте Ch2: def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): BooleanScala: Заказ [Int] .lt вызов не выполняется для вызова метода рефлексии

Следующий тест не так, как описано в комментарии:

"Method isSorted" should "return true for a sorted array" in { 
    val methods = 
     Table(
     ("method"), 
     ("isSorted") 
    ) 

    val m = ru.runtimeMirror(getClass.getClassLoader) 
    val mod = ru.typeOf[Ch2.type].termSymbol.asModule 
    val mm = m.reflectModule(mod) 
    val obj = mm.instance 
    val im = m.reflect(obj) 

    forAll(methods) { (m: String) => 
     val isSortedMethod = ru.typeOf[Ch2.type].decl(ru.TermName(m)).asMethod 
     val isSorted = im.reflectMethod(isSortedMethod) 

     // Fails at runtime with 'missing parameter type for expanded function' 
     isSorted(Array(1, 2, 3, 4), Ordering[Int].lt(_, _)) 
    } 
} 

Конечно, я мог бы заменить Ordering[Int].lt с (x: Int, y: Int) => x < y и было бы работать но я предпочел бы использовать то, что уже было предоставлено, вместо того, чтобы кататься самостоятельно.

ответ

1

Компилятор не может вызывать тип A в вашем запросе. Попробуйте сделать звонок без отражения.

Вы должны указать тип во время вызова, как

isSorted(Array(1, 2, 3, 4), (x: Int, y: Int) => Ordering[Int].lt(x, y)) 
+0

«> Попробуйте сделать вызов без отражения.» Это победит цель обучения. Кроме того, рассмотрим случай, когда я реализую метод несколькими способами (см. [This] (http://stackoverflow.com/questions/34960325/scala-how-do-i-use-foldleft-with-a-generic- массив)). Вместо того, чтобы писать одинаковые тестовые примеры для каждого метода, я мог бы использовать таблицу данных и просто ссылаться на каждый метод рефлексивно. I/p и o/p одинаковы, поэтому это идеальный кандидат для таблиц данных. –

+0

@AbhijitSarkar Вы поняли меня не так. Я не советовал вам исправить вашу проблему, не используя рефлексию. Я посоветовал вам проверить, как сделать свой звонок без размышлений, чтобы увидеть проблему, с которой вы столкнулись. И тогда вы можете использовать отражение. Также см. Редактирование, я изменил предлагаемое решение на то, которое работает с рефлексией. – Archeg

+0

У меня возникла проблема с этим: 'val lt = Ordering [Int] .lt (_, _)', а затем 'isSorted (Array (1,2,3,4), lt) –