【问题标题】:Scala error: missing parameter type for expanded functionScala 错误:缺少扩展函数的参数类型
【发布时间】:2015-06-19 23:46:57
【问题描述】:

我正在尝试为 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)
    }
}

...

val results = Query.from(users)
    .join(accounts).on(_.userId).equals(_.ownerUserId).into((_, _))

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

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

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

【问题讨论】:

    标签: scala generics compiler-errors


    【解决方案1】:

    问题很简单。继承自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
    

    从上一个例子可以看出,当传递了错误的函数类型时,编译器不得不选择def equals(Any): Boolean。当你不指定任何类型时,编译器必须推断一个,这在示例中是做不到的。

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

    【讨论】:

    • 我明白了。所以这只是解决方法重载歧义的问题。如果错误消息更清楚,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多