19

假设您有以下内容:

foo(x: String)(y: Int): Int
foo(x: String)(y: Double): Int

Scala 不允许这样的表达。据我所知,原因是 foo("asdf") 没有明确定义的类型(它是 Int => Int 或 Double => Int)。

是否有理由不允许这种“多型”功能?

4

3 回答 3

23

Scala 中的重载解析仅考虑第一个参数列表。这就是为什么这个列表中的替代品必须已经不同的原因。这有一个很好的理由:然后我们可以使用解析函数的类型来推断后续参数的类型。这可以使用以下成语:

xs.corresponds(ys) { (x, y) => x < y }

请注意,这里我们需要知道 的类型corresponds才能推断 和 的x类型ycorresponds超载时出现这种故障将是一种耻辱。

于 2011-08-24T21:48:35.080 回答
2

这不是第一次被问到这个问题:早在 2009 年就有人问过了。不幸的是,Martin 没有明确说明问题是什么,只是需要对重载的工作原理进行相当广泛的规范更改。我查看了规范,我不清楚核心问题在哪里,但我对规范的熟练程度不足以给出明确的答案。

于 2011-08-24T18:14:15.123 回答
2

一个简单的解决方法是使用匿名对象:

def foo(x: String) = new {
  def apply(y: Int): Int
  def apply(y: Double): Int
}
于 2019-06-28T15:28:39.633 回答