【问题标题】:Scala: reflection with different argument typesScala:具有不同参数类型的反射
【发布时间】:2026-01-13 13:15:01
【问题描述】:

我正在尝试使用反射,与this question 的答案中所见的方式几乎相同。问题是我的代码如下所示:

class A {
  def query1(arg: Int): String = { Some code }
  def query2(arg: String): String = { Some code }
  def query3(): String = { Some code }
}

object A {
  def apply(query: String, arg: Any): String = {
    val a = new A
    val method = a.getClass.getMethod(query,arg.getClass)
    method.invoke(a,arg)
  }
}

但这无法编译,我得到一个错误:

type mismatch; found: Any, required: Object

有什么想法可以让我完成这项工作吗?

【问题讨论】:

    标签: scala reflection


    【解决方案1】:
    object A {
      def apply(query: String, arg: AnyRef): String = {
        val a = new A
        val method = a.getClass.getMethod(query, arg.getClass)
        method.invoke(a, arg).toString
      }
    }
    

    这里的问题是Any也可以是原始类型,即IntShortLong等,在Java中不是对象,所以如果invoke方法期望Object,您需要一个编译时保证您提供给该方法的所有内容也将是 Object

    【讨论】:

    • 行不通。我得到type mismatch: found Int, required: AnyRef
    • @shakedzy 这正是该方法试图做的事情,阻止您使用Int 和任何其他原语。您必须手动调用 Int.box(33) 和其他原语上的类似强制转换才能将它们作为参数传递。
    • @shakedzy 这看起来像一个巨大的代码气味,如果你不只是研究,那么值得概述你想要实现的目标,如果这是关于具有类型改进的行为,然后是密封类型系列和上下文边界是你想要的。
    • 我似乎无法理解..我运行A("query2",Int.box(33)) 仍然出现错误.. Any/AnyRef/AnyVal 的这个区域在 Scala 中不是我完全理解的..跨度>
    最近更新 更多