Scala:为反射方法调用排序[Int] .lt调用失败

时间:2016-01-23 06:07:46

标签: scala reflection scalatest mirror

我正在使用Scala反射和ScalaTest。我在对象Ch2中定义了如下方法: def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean

以下测试失败,如评论中所述:

"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 个答案:

答案 0 :(得分:1)

编译器无法推断出呼叫中的A类型。尝试在没有反射的情况下拨打电话。

您应该在通话期间指定类型

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