1
object GoodReturnType extends Dynamic {
  def applyDynamic(method: String)(args: Any*) = {
    method match {
      case "foo" => 25
      case "bar" => 14
    }
  }
}

GoodReturnType对象的方法applyDynamic具有Int返回类型。正如预期的那样,对其动态方法的调用也返回Int

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

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

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

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

4

2 回答 2

4

原则上这是不可能的,因为您是基于动态信息进行调度的。因此,即使您有一个以特定方式键入的响应,调用代码也不知道从可用集合中返回了哪种类型。如果你愿意,你可以用它Either来明确地表达这一点(例如Left(5)并且Right("muahaha")会 return Either[Int,String]),但基本上你不能在经过动态调度步骤后保留你的静态类型。如果您不打算将其用作动态调度步骤,为什么不直接将方法放入?

于 2013-01-23T16:24:20.810 回答
2

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

如果您还没有,请学习SIP 17:键入 Dynamic

于 2013-01-23T16:55:03.473 回答