簡體   English   中英

Scala 錯誤:缺少擴展函數的參數類型

[英]Scala error: missing parameter type for expanded function

我正在嘗試為 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來明確說明參數類型是什么。 但是,我試圖使它成為一個非常流暢的庫,這使它變得混亂。

問題很簡單。 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 當您不指定任何類型時,編譯器必須推斷出一個類型,而在示例中無法做到這一點。

只需將您的方法重命名為其他名稱,問題就消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM