Scala 我可以创建一个包含多个动态方法和不同返回类型的类吗?

Scala 我可以创建一个包含多个动态方法和不同返回类型的类吗?,scala,Scala,GoodReturnType对象的方法applyDynamic具有Int返回类型。正如所料,对其动态方法的调用也会返回Int 如果我们尝试添加另一个具有不同返回类型的动态方法,则applyDynamic的返回类型将是最常见的类型(任意)。所有的动态方法也是如此 scala> GoodReturnType.foo() res0: Int = 25 是否可以让一个类具有多个具有不同返回类型的动态方法?这在原则上是不可能的,因为您是基于动态信息进行调度的。因此,即使您有一个以特定方式键入的响

GoodReturnType对象的方法applyDynamic具有Int返回类型。正如所料,对其动态方法的调用也会返回Int

如果我们尝试添加另一个具有不同返回类型的动态方法,则applyDynamic的返回类型将是最常见的类型(任意)。所有的动态方法也是如此

scala> GoodReturnType.foo() 
res0: Int = 25

是否可以让一个类具有多个具有不同返回类型的动态方法?

这在原则上是不可能的,因为您是基于动态信息进行调度的。因此,即使您有一个以特定方式键入的响应,调用代码也不知道从可用集返回的是哪种类型。如果需要,您可以使用
来明确表示(例如
Left(5)
Right(“muahahaha”)
将返回
或[Int,String]
),但基本上,在经过动态分派步骤后,您无法保留静态键入。如果不打算将此作为动态调度步骤,为什么不直接将此方法放入?

这在原则上是不可能的,因为您是基于动态信息进行调度的。因此,即使您有一个以特定方式键入的响应,调用代码也不知道从可用集返回的是哪种类型。如果需要,您可以使用
来明确表示(例如
Left(5)
Right(“muahahaha”)
将返回
或[Int,String]
),但基本上,在经过动态分派步骤后,您无法保留静态键入。如果您不打算将其用作动态分派步骤,为什么不直接将该方法放入其中?

不,您不能。存在一组固定的、预先确定的
动态
方法,所有非静态检查的引用都映射到这些方法。JVM不支持仅基于返回类型的方法解析,因此必须为给定的参数签名选择单个实现


如果你还没有,学习。

不,你不能。存在一组固定的、预先确定的
动态
方法,所有非静态检查的引用都映射到这些方法。JVM不支持仅基于返回类型的方法解析,因此必须为给定的参数签名选择单个实现


如果你还没有,那就研究一下。

>为什么不直接把这个方法放进去呢?只是一个语法示例,尽可能简单。问这个问题是因为我很好奇是否可以创建“动态”orm:user.findById(id:id):user;user.findAll():List[user],user.wheregegt(21):List[user];正如您所看到的,返回类型是不同的。我的猜测是“trait-Record-extends-Dynamic”,在invokeDynamic方法中使用解析器,但这不会起作用,因为我理解>为什么不直接将该方法放入?只是一个语法示例,尽可能简单。问这个问题是因为我很好奇是否可以创建“动态”orm:user.findById(id:id):user;user.findAll():List[user],user.wheregegt(21):List[user];正如您所看到的,返回类型是不同的。我的猜测是“trait-Record-extends-Dynamic”,在invokeDynamic方法中使用解析器,但据我所知,这是行不通的
scala> GoodReturnType.foo() 
res0: Int = 25
object BadReturnType extends Dynamic {
  def applyDynamic(method: String)(args: Any*) = {
    method match {
      case "foo" => 25
      case "bar" => 14
      case "baz" => "muahahaha!"
    }
  }
}

scala> BadReturnType.foo() 
res1: Any = 25