Scala错误:扩展函数缺少参数类型

Scala错误:扩展函数缺少参数类型,scala,generics,compiler-errors,Scala,Generics,Compiler Errors,我正在尝试为Scala编写一个查询库。以下是迄今为止的代码: class Query[TElement](source: Traversable[TElement]) { def join[TOther](other: Traversable[TOther]) = new { def on[TKey](keySelector1: TElement => TKey) = new { def equals(keySelector2: TOther

我正在尝试为Scala编写一个查询库。以下是迄今为止的代码:

class Query[TElement](source: Traversable[TElement]) {
    def join[TOther](other: Traversable[TOther]) = new {
        def on[TKey](keySelector1: TElement => TKey) = new {
            def equals(keySelector2: TOther => TKey) = new {
                def into[TResult](resultSelector: (TElement, TOther) => TResult): Query[TResult] = {
                    val map = source.map(e => (keySelector1(e), e)).toMap
                    val results = other
                        .map(e => (keySelector2(e), e))
                        .filter(p => map.contains(p._1))
                        .map(p => (map(p._1), p._2))
                        .map(p => resultSelector(p._1, p._2))
                    new Query[TResult](results)
                }
            }
        }
    }
}

object Query {
    def from[TElement](source: Traversable[TElement]): Query[TElement] = {
        new Query[TElement](source)
    }
}

我在编译时遇到以下错误:

error: missing parameter type for expanded function ((x$2) => x$2.ownerUserId)

我有点困惑,为什么在非泛型函数
equals
上会出现此错误。我认为,它的通用参数来自外部范围。我知道要修复它,我必须通过编写
(a:Account)=>a.ownerUserId
来明确说明参数类型。然而,我试图使它成为一个非常流畅的库,这使它变得混乱。

问题非常简单。继承自
Any
的现有方法
equals
存在歧义。简单的例子:

scala> class X[A, B] { def equals(f: A => B) = f }
defined class X

scala> val x = new X[Int, String]
x: X[Int,String] = X@52d455b8

scala> x.equals((x: Int) => x.toString)
res0: Int => String = <function1>

scala> x.equals((x: String) => x.toString) // uh-oh
res1: Boolean = false
scala>classx[A,B]{def等于(f:A=>B)=f}
定义类X
scala>val x=new x[Int,String]
x:x[Int,String]=X@52d455b8
scala>x.equals((x:Int)=>x.toString)
res0:Int=>String=
scala>x.equals((x:String)=>x.toString)//uh-oh
res1:Boolean=false
在上一个示例中可以看到,当传递错误的函数类型时,编译器必须选择
def equals(Any):Boolean
。当您不指定任何类型时,编译器必须推断一个类型,而在示例中它不能这样做


只需将您的方法重命名为其他方法,问题就消失了。

我明白了。所以这只是一个解决方法过载歧义的问题。如果错误消息能更清楚地说明这一点就好了。
scala> class X[A, B] { def equals(f: A => B) = f }
defined class X

scala> val x = new X[Int, String]
x: X[Int,String] = X@52d455b8

scala> x.equals((x: Int) => x.toString)
res0: Int => String = <function1>

scala> x.equals((x: String) => x.toString) // uh-oh
res1: Boolean = false